GRRERBENNN
va: WR
Inieriage Age IT If
Systemlhaneluch i j III
= NN
COMMoOLELE HA ua ea
2 EEE
a FE
EIS!
B£, SERIE
SESERIETTETN
Ral 2 Babel Fin ® SEX.
..w KRISE
IISTER 2
TRIER Aa
. PEN
RR
Michael Krau .
” er x ei N <=
IT q nn
A »
D
DAS INTERFACE AGE SYSTEMHANDBUCH ZUM COMMODORE 64 UND VC-20
Ralph Babel
unter Mitarbeit von
Michael Krause und Andreas Dripke
Gesamtherstellung
Unternehmensberatung Andreas Dripke
Vertrieb
INTERFACE AGE
Verlagsgesellschaft
VORWORT
Die Nutzbarkeit eines Computers aus der Sicht des Program-
mierers hängt in entscheidender Weise von der verfügbaren
Dokumentation ab. Für effiziente Programmierung ist die
genaue Kenntnis der internen Strukturen unerläßlich.
In dem vorliegenden Werk wird das Betriebssystem des Commo-
dore 64 unter Einbeziehung des VC-20 ausführlich und umfas-
send dargelegt. Viele der in diesem Buch enthaltenen Infor-
mationen dürften zum Zeitpunkt des Erscheinens nur wenigen
Menschen auf der Erde bekannt sein. Sie finden hierin alle
Daten, die für die Programmierung des Computers relevant
sind.
Alle in diesem Buch genannten fakten wurden sorgfältig
recherchiert und äußerst sorgsam aufbereitet.
Die Informationen sind sowohl für den BASIC- als auch für
den Assembler-Programmierer geeignet. Dabei wird es für Sie
oftmals unerläßlich sein, Abschnitte mehrmals zu lesen, um
sie voll zu verstehen. Die Fülle an Daten - komprimiert in
einem Handbuch - macht dies erforderlich. Hätten wir einen
weiter ausschweifenden Stil gewählt und damit diesem Buch
mindestens dreimal so viele Seiten gegeben, so wäre es prak-
tisch unmöglich, Daten gezielt zu suchen und insbesondere zu
finden. Das Systemhandbuch ist sowohl zum Durchlesen als
auch als Nachschlagewerk geeignet.
Bitte haben Sie Verständnis dafür, daß wir keine Fragen zur
Programmierung beantworten können. Würden wir dies einmal
anfangen, kämen wir sicherlich nicht mehr dazu, weitere
Bücher für Sie zu schreiben. Wir freuen uns aber über Kritik
und Anregungen von Ihnen und werden diese in einer weiteren
Auflage des Werkes berücksichtigen. Und wenn Ihnen unser
Buch gefällt, freuen wir uns natürlich über Ihre Empfehlung
an Kollegen, Bekannte und Freunde. i
Nun wollen wir Sie der faszinierenden Fülle an Daten über-
lassen, die Ihnen dieses Buch zu bieten hat. Möge es Ihnen
ein hilfreches Handbuch bei der Programmierung Ihres Compu-
ters sein.
Ralph Babel
Michael Krause
Andreas Dripke
Babel, Ralph; Krause, Michael; Dripke, Andreas
DAS INTERFACE AGE SYSTEMHANDBUCH ZUM COMMODORE 64 UND VC-20
1. (1983)
2. (1983)
ISBN 3-88986-001-X
Dieses Buch ist mit internationalem Copyright belegt. Alle
Rechte vorbehalten. Kein Teil des Werkes darf in irgendeiner
Form ohne schriftliche Genehmigung von Andreas Dripke
reproduziert, übersetzt, verarbeitet, verbreitet oder
veröffentlicht werden.
Weder Autoren noch Verlag oder Händler übernehmen eine
Gewähr dafür, daß das Werk frei von Fehlern ist. Für
Schäden, die durch solche Fehler entstehen, insbesondere für
Folgeschäden, wird keine Haftung übernommen.
Die Veröffentlichung von Namen, Schaltungen, Programmen,
Verfahren, Funktionsgruppen etc. in diesem Buch berechtigt
nicht zu der Annahme, daß diese frei von Schutzrechten
Dritter seien.
Made in West Germany
Copyright (C) 1983 by Unternehmensberatung Andreas Dripke
Gesamtherstellung: Unternehmensberatung Andreas Dripke
Distribution(BRD): INTERFACE AGE VERLAG GMBH, Vohburgerstr.]
D-8000 München 21, Tel. (089) 5 80 67 02.
Director Sales/Marketing: Issi Franckh
International Distribution: COMPUTER BOOKBASE
(DATA DYNAMICS TECHNOLOGY, USA)
Div. of INTERFACE AGE Inc.
16704 Marquardt Avenue
Cerritos, CA 90701, U.S.A.
Druck: Offsetdruck Georg Kapehl, Wiesbaden
INHALTSVERZEICHNIS
VOrWOTEN.G GN a aa ns een een
InhalEsverzeichnzs zus. een
1. BASIE=-Interpreter „ur:
Interne Codierung der BASIC-Programme ..... ee
Tabelle der BASIC-Befehle ......sceerereoeeeeenenn
Binärarithmetik oo. ... o oe oe oe oo 08 v...—. 1. .:.—.0—© 0 eeov01e eo oo 0 08 0 0
Darstellung von Fließkommazahlen ........erecer0..
Darstellung und Ablage von Variablen ............
Nicht-indizierte Variablentypen .......c.:..
Arrays oo. ....2—.>.0—0© ee vv. .:e ee. oe oo oe © oe... .“.a„...„.”a.n”.”eC"eeese oe.
USR-Funktion . .. 0. 01 0 0 0 oo oo 0 _—. er ar era er
steuercöde-Auflistung „cs sn 00er 000006 Rn
Steuercodes in Listings ........ een
2. Assembler .eo oe 0 0 0 0 90 90 98 90 0 0 0 98 08 8 8 HH HH Vf 8 oe oe... ...”e”.—.e7—e067. .». .ee....
Einführung in Assembler ............ enrese BERPTE
4.
Assembler/Disassembler .....ec:eeeeoneeeereennnn nn
Assembler-Befehlsliste: „issue... 222 53
Symbolische Befehlsliste ......cceceooeeneeeneenee
Adressierungsarten „2.00 2. 0 aan
Graphik und Farbe (VIC-II-Chip) ....c:.20.. EEE
Bildschirmspeicher ....... ES RE ER EIER >
karbspeicher. sis... er ERTL
Zeichengenerator ...... na een
Definition eigener Zeichen ......cc.ece.00e0.e
Modus für erweitere Hintergrundfarben ......
Mehrfarbige Zeichen (Multicolor-Modus) .....
Hochauflösende Graphik (Hi Res) ....eecccrecnconee
Standard Bit-Map-Modus .....sceeeneeeeeeenee
Multicolor-Bit-Map-Modus .....cseecr0. Seas
Sprites - MOB '"Movable Object Block" ....... ee
Aufbau-eines SprTrites u... 4.,4220u2.0 0. a
Multicolor-Sprites ........:.. ERIRITREERN a
Prioritäten zu... 4404 ee ee EEE
Kollısionen ser ar u
Interrupt- und Graphik-Kontrolle .....vseccccceoe
Screen Blanking ee ee ne ee ee
Scerolling in Punktzeilen (Smooth ee ee
Registerübersicht ......... eier lee ie
Farben_des VIC-II-Chips ...o.vereeoneeeennnennn ne
Pinbelegung des VIC-II-Chips ..... EST RT FR
SPTILE=-ENtwuürfsblatl. us ss na
Sprite-Generator-Programm ........ ELTERN
Funke 1onstästen. „es: sr EEE
>.
10.
Tonerzeugung (SID 6581 Chip) ........ es re
Tongenerator (Frequenzberechnung) ......c.r.... a
ADSR-Funktion sa... et a as EN en
Wellenformen .......sc.0..0. el er ET ETE
Tonerzeugung ........ EUER EIETIEEETN et
Filter 4,.228%% EURER ETUI
Tongeneratort 3 za. rer
Hullküurve .,2. 5300004 ee FREE
Oszillatorn „asus nenne ee er
A/DeWändler 2. erh ER TRREN >
Registerübersicht ....... ee ee
Pinbelegung ss. a
Ein/Ausgabe (I/D) .....c..0.2.. BESTEN ELRHENR es
seriellen. Bus. 2:42. u 2 En an
RS=232 Datentransfer +»... 0.20 a, 1 2 a
EIA.:6526 Chip ass
Portprogrammierung ........+.. see ers
serieller.-Port>»22:uuuu anne ee
Timer ons
"Tine DEF Day" Clock. u. ren il
Interrupt-Handling .....vc2creeeoreeenneeenne
Registerübersicht ....... nee ee
Anwendung im Commodore 64 .....cereeererene.e
Pinbelegung .„.ccscoeesesecne..e ....00..+ EEE
Control-Ports ..... DE er DENE
Joystick zueuncnaaaeer ee
Paddle 4.445 ee es
Lightpen +»... 028. 0 een
Datenspeicherung Cassette/Diskette .........c....
Cassette ..v.coococoeseenesen nee sennnene ea.
Header ...o-oser00essseeenne IRRE
Datentypen ...:csc..0 0000000... EEE
Zusammenfügen von Programmen .......+. s
Diskette ausser ae era ene
Dverlay ........ ee reeiee
Echtzeituhr (EIA TIock) san it
Adaption von CBM-Programmen .....s.e.:. eek
Speicheraufteilung .......... TESTER ITETTN
Speicherübersicht ........osc0s00s..00% EEFLIERTE
Memory Map .. oo oo0eooneee seen een ernennen ne
CPU 6510 / Speicherverwaltung ......o.rercc0.. BR
Prozessorport .„....ecceeeeeeocseeeonneene ae
Banking ...<oeeeeueneeenn nennen nn een.
Pinbelegung der CPU 6510 .....voerreeeeneenee
ROM-LIStIiNG cr rer
ROM-Listing Commodore 64 .....ceereerereneneenene
Adressumrechnung für VC-20 ...c.erereeeeerenneenee
Systemroutinen .....ccececeeenene ee ae
Stichwortverzeichnis ....... a a a ee ee RER
30C
INTERNE CODIERUNG DER BASIC-PROGRAMME
BASIC-Befehle werden, zur Einsparung von Speicherplatz und
zur Beschleunigung der Programmausfuehrung, in einen be-
stimmten Code umgewandelt. Ausserdem wird jeder Programmzei-
le noch die Information ueber die Ablageposition der naech-
sten Programmzeile mitgegeben, die das Suchen von Programn-
zeilen (zum Beispiel bei Sprungbefehlen) vereinfacht und die
Suchgeschwindigkeit erhoeht. Dies geschieht beim 'Abschik-
ken' einer Programmzeile durch die RETURN-Taste. Auch Befeh-
le, die im Direktmodus gegeben werden, werden in die soae-
nannten 'Tokens' umgewandelt, bleiben jedoch im BASIC-Einaa-
bepuffer ab Adresse 512 stehen. Daraus resultiert auch, wa-
rum Befehle, die auch den Eingabepuffer benoetigen (INPUT,
INPUT# und GET(#)), im Direktmodus im Normalfall nicht aus-
gefuehrt werden koennen.
Die Startadresse eines BASIC-Programms steht als Pointer in
den Adressen 43 und 44 und kann durch ...
PRINT PEEK(43) + 256 * PEEK(44)
... abgefragt werden. Im Normalfall duerfte das Ergebnis
gleich 2049 sein, da dies die vom Betriebssystem vorgesehene
Startadresse fuer BASIC-Programme ist, die jedoch fuer eige-
ne Anwendungen geaendert werden kann.
Die ersten beiden Bytes jeder Programmzeile (bei der ersten
Zeile eines Programms sind das die Speicherstellen 2149 und
2050) enthalten die Startadresse der naechsten Zeile im
Adressformat, wobei (wie das in fast allen Faellen der Ab-
speicherung von 16-Bit-Werten ist) zuerst die Adresse low
und dann die Adresse high abgespeichert wird.
Die naechsten beiden Bytes stellen die Zeilennummer der Pro-
grammzeile dar, die im Normalfall im Bereich von 0 bis 63999
liegt. Durch 'POKE' ist es jedoch auch moeglich, hoehere
Zeilennummern (bis 65535) zu erzeugen, was dann aber bei
Sprungbefehlen und zum Beispiel bei 'INPUT' zu sicherlich
unerwuenschten Effekten fuehren kann.
Danach folgt der eigentliche Programmtext, wobei alle Befeh-
le, Funktionen und Operatoren in Tokens codiert sind. Davon
unbetroffen bleiben alle Texte, die innerhalb von Anfueh-
rungszeichen stehen, Bemerkungen nach 'REM' sowie Daten nach
einem 'DATA'-Befehl. Der Programmtext ist mit dem Nullcode
abgeschlossen.
Dieser Aufbau wiederholt sich bis zur letzten Zeile, der
dann zwei Nullcodes folgen, die das Programmende markieren.
Der Zeiger auf den Anfang der Variablentabelle zeigt auf das
erste Zeichen nach den beiden (es sind, zusammen mit dem
Nullcode zur Markierung des Endes der Programmzeile, drei
aufeinanderfolgende Nullcodes) Nullcodes. Dieser ° Zeiger
steht in den Adressen 45 und 46 und ist aeqauivalent dem
Pointer auf den Anfang des BASIC-Programms abzufragen.
Die Laenge eines Programms kann, unabhaengiq von eventuell
schon definierten Variablen, durch folgende Befehlsfolge ab-
gefragt werden
PRINT PEEK(45) + 256 * PEEK(46) - PEEK(43) - 256 * PEEK(44)
vas zum Beispiel bei sich selbst modifizierenden Pro-
grammen oder waehrend der Entwicklung von Programmen zur
Ueberwachung der Programmlaenge verwendet werden kann.
Ein Beispiel fuer die intere Codierung
Folgendes Programm wird, nach der Eingabe von 'NEW', um ein
eventuell noch vorhandenes Programm zu loeschen, in den Com-
modore 64 eingegeben.
100 rem test
500 print "Tokens
999 end
Diese drei Zeilen werden nun durch folgende Werte darge-
stellt (der jeweils erste Wert einer Zeile gibt die Start-
adresse der jeweiligen Zeile nur zum besseren Verstaendnis
an und hat mit der Abspeicherung nichts zu tun).
2049 12 8100 0143 32 84 69 83 84 0
REM t e Ss t
2060 28 8 244 1153 32 34 212 94 75 69 78 83 0
PRINT „ T Oo k e n s
2076 34 8 231 3 128 0
END
2082 0 0
Betrachten wir nun die ersten beiden Bytes der ersten Pro-
grammzeile, so stellen wir fest, dass diese auf die naechste
Programmzeile zeigen (12 + 256 * ß = 2060). Diese beiden
Bytes haben nun die Werte 28 und B und ergeben genau die
Startadresse der dritten Programmzeile (28 + 256 * 8 =
2076). Das gleiche ist auch bei der letzen Programmzeile der
Fall, davon abgesehen, dass nun keine Programmzeile mehr
folgt, sondern auf die beiden Nullcodes zur Kennzeichnuna
des Endes eines Programms gezeigt wird. Diese Pointer, die
jeweils auf den Pointer der naechsten Zeile zeigen, werden
auch Linkpointer genannt, da sie die Verbindung zwischen den
einzelnen Zeilen herstellen.
Das jeweils dritte und vierte Byte von Programmzeilen aibt
die Zeilennummer an. Da die Zeilennummern im Bereich von 0
bis 63999 liegen koennen, werden sie, ebenso wie die Link-
pointer, in zwei Bytes aufgespalten. So wird die Zeilennum-
mer '999' durch die beiden Bytes 231 und 3 (231 + 256 * 3 =
999) dargestellt.
Der Programmtext selbst ist in Einzelbytes aufgebaut. Jedem
Befehl ist ein Wert zugewiesen, in diesem Beispiel sind das
'REM' mit dem Code 143, 'PRINT' mit dem Code 153 sowie 'END'
mit dem Code 128.
Waehrend die Leercodes direkt nach der Zeilennummer nicht
abgespeichert werden, so ist. dies doch bei allen Leercodes
der Fall, die ansonsten eingegeben werden.
Eine vollstaendige Aufstellung der Tokens ist der Tabelle
der Interpretercodes oder dem Betriebssystemlisting zu ent-
nehmen.
Takelle der BERASIC-Befehle.
Die Befehle sind alphasketisch aesordrnet, da
Reihe der Interpretercoades aus dem RüOM-Listi
abs
and
3SC.
atn
chr$
close
cir
cmd
cont
cos
data
def
dim
end
exp
fn
for
fre
get
C
goszuk
Aatc
if
input
input#
int
182
175
198
193
133
180
156
157
154
130
131
154
134
128
189
1655
129
184
181
2093
141
137
1:33
133
132
181
left$
lern
let
list
load
1ca4
mid
new
next
not
ar
aper
cr
peel:
pake
pas
errint
rrint#
read
rem
restore
return
riaht$
rnd
run
zan,e
ler
ler
1E
new
nE
nC
an
or
or
rE
258
1353
136
155
147
133
ea2
162
130
188
145
153
175
134
151
135
173
132
135
143
140
142
zual
197
138
143
Interpretercaodes
Folsende Cades finden zusserdem Verwendung:
a
32 kis 95 identisch
255
und Akkuer zungen
die Ruflistung
n4 ersichtlich
Nullcode am Zeilenende und Proar ammerde
mit dem
Coade fuer PI
Die Codes li kis 31.
Grundversion des Betriekssuvstems nicht verwendet. werden jedach
teilweise von der Standard-ERSIC-Erweiteruna EXsEBRASIC
kenutzt.
9& kiss 127
ıarıd
ad bis
Lonmadere—-ASCII
zan eG
sin =1
sp. =P
za =Uü
step =tE
stop =T
str$ =tR
sus er
+tak: A
tarı tar
then tH
+0 +0
UeEr 115
al A
„eritw JE
wait wAÄ
+ +
# #
” e”
224 werden
LEVEL
in
ist,
fe jeub feed jeub feeb fjmehb fe jun fe fen fe Sen feeb fen fee jemib
LEN ohne! in
Home) NO
SAUNA N
VONLUN-N
fh fm eb be jenb jub jeeb fees
der
Il
BINAERARITHMETIK
Binaeres Rechnen und Umgang mit binaeren Zahlen wird beim
Arbeiten mit dem Computer immer wieder benoetigt. Ganz
gleich, ob es sich dabei um die hochaufloesende Graphik, die
Definition von Zeichen oder das Aendern einzelner Bits in
bestimmten Registern handelt. \
Eine Zahl im fuer uns gebraeuchlichen Dezimalsystem kann aus
mehreren Ziffern bestehen. Dabei wird die hintere Ziffer als
Einerstelle bezeichnet. Die vorletzte Ziffer ist die Zehner-
stelle, die drittletzte Stelle bestimmt die Anzahl an Hun-
dertern und so weiter. Von der Zahl eins fuer die letzte
Stelle ausgehend wird der Stellenwert einer Ziffer fuer iede
Stelle weiter links mit zehn multipliziert. Klar, denn unser
Zahlensystem kennt schliesslich auch zehn Ziffern. Die Zahl
1983 heisst also nicht anderes als... |
1983 = 1 * 1000 + 9 * 100 +8 *10 +3 *]
Da das Binaersystem jedoch nur zwei Zustaende kennt (Strom
fliesst, Strom fliesst nicht), stehen hier also auch nur
zwei verschiedene Ziffern zur Verfuegung. Die Stellenverte
einzelner Ziffern koennen also nicht das zehnfache der
rechts davon stehenden Ziffer betragen, sondern nur das Nop-
pelte. Somit ergeben sich zum Beispie) fuer das Binaersystem
folgende Stellenwerte: fuer die letzte Stelle, wie in jedem
Zahlensystem, den Stellenwert eins, dann der Wert zwei, da-
rauf vier, als Stellenwert fuer die viertletzte Stelle den
Wert acht und entsprechend jeweils das Doppelte fuer weitere
Stellen.
Da als Ziffern nur die Zahlen O und 1 zur Verfuegung stehen,
hat eine Stelle demnach entweder den Wert null (falls die
Ziffer null an dieser Stelle steht) oder den Stellenvert der
entsprechenden Stelle (falls die Ziffer eins an dieser Stel-
le steht). Dieses eigentlich recht einfache Prinzip ist
Grundlage jeglicher Operationen des Computers. Auch das
Rechnen erfolgt im Binaersystem, die eingegebenen Dezimal-
zahlen werden fuer interne Berechnungen naemlich erst in das
Binaersystem umgewandelt.
Die einzelnen Ziffern einer Binaerzahl, "Bits" genannt, wer-
den von ihrer Position von rechts her mit Null beginnend
durchnummeriert. Bit 4 zum Beispiel ist demnach die fuenfte
Stelle einer Binaerzahl (von rechts!). Die Stellenwerte ]as-
sen sich durch diese Vereinbarung sehr leicht errechnen. Es
muss nur die Bitposition zur Basis zwei potenziert werden.
Fuer Bit 4 ergibt dies einen Stellenvert von 2 4 (lies:
zwei hoch vier), entsprechend dem Dezimalvert 16. Ein Bit
(oder eine bestimmte Bitposition) zu SETZEN . heisst nun
nichts anderes, als dieser Binaerstelle den Ziffernwert ']1'
zuzuweisen. Das LOESCHEN eines Bits entspricht demnach der
Zuweisung des Ziffernvwerts '0' an eine Bitposition.
Da der Commodore 64 einen Prozessor mit einem "8-Bit-Daten-
bus" besitzt, werden jegliche Speicheroperationen immer mit
acht Bits gleichzeitig ausgefuehrt. Werden Daten aus dem
Speicher gelesen, so werden immer acht Bits gelesen, so auch
bei den Befehlen "POKE" und "PEEK", die immer Daten mit ei-
ner Breite von acht Bits schreiben beziehunasveise lesen.
Bei der sogenannten "vorzeichenlosen Binaerarithmetik" mit
acht Bits haben die einzelnen Stellen folgende Stellenverte:
10
Der Minimalvert (alle Bits geloescht), den eine vorzeichen-
lose Binaerzahl annehmen kann, ist demnach der Wert 0, der
Maximalwert (alle Bits gesetzt) einer achtstelligen Binaer-
zahl ist 255. Eine solche Binaerzahl mit einer Breite von
acht Bits nennt man auch "Byte". Ein Byte ist also gleichzu-
setzen mit acht Bits.
Zusaetzlich zu den Bytes existieren nun noch die "Adressen".
Eine Adresse ist eine vorzeichenlose Binaerzahl, die aus
sechzehn Bits (entsprechend zwei Bytes) besteht. Durch eine
Adresse kann die Position bestimmter Stellen im Arbeitsspei-
cher festgelegt werden. Zwei aufeinanderfolgende Bytes im
Arbeitsspeicher, die auf eine andere Stelle verweisen, nennt
man "Pointer".
Hierzu gleich zwei Programme, die die Umwandlung einer na-
tuerlichen Dezimalzahl ins Binaersystem und umgekehrt vor-
nehmen:
Binaer nach Dezimal:
100 INPUT B$ : D =D : FOR I = 1 TO LEN (B$)
110 S$ = MID$ (B$, I, 1)
120 IF S$ C "o" OR S$ > "1" THEN I = LEN (B$) : NEXT : END
130 D =D * 2 +» ASC (S$) - 48 : NEXT : PRINT D : END
Dezimal nach Binaer:
200 INPUT D : B$ = ""
210 R = INT (D / 2) : B$ = CHR$ (D- R* 2 + 48) + B$
220D=R : IF R GOTO 210
230 PRINT B$ : END
Bei der Umwandlung ins Binaersystem werden die Binaerzahlen
so umgewandelt, dass fuehrende Nullen unbeachtet bleiben.
Ist eine Darstellung des Binaeraequivalents von Dezimalzah-
len im Bereich von OD bis 255 in Form von acht Binaerstellen
erwuenscht (Auffuellen auf eine Laenge von acht Ziffern), so
ist folgende Programmzeile hinzuzufuegen:
225 IF LEN (B$) C 8 THEN B$ = RIGHT$ ("0000000" + B$, 8)
Allerdings kann ein Byte nicht nur die Funktion der Darstel-
lung einer Zahl haben (arithmetische Funktion). Es ist moeg-
lich, dass jedem Bit in einem Byte eine bestimmte Funktion
zukommt (logische Funktion). So koennen anhand eines Bytes
insgesamt acht Bedingungen mit je zwei Moeglichkeiten abge-
prueft werden. Man nennt in diesem Fall ein solches Bit, mit
der Bedeutung als Hinveis fuer eine Ja/Nein-Entscheidung,
eine "Flag", was soviel heisst wie "Flagge".
Solche "Flags" treten besonders in bestimmten "Registern"
auf. Ein Register ist ein Byte innerhalb des Arbeitsbereichs
des Computers, das eine bestimmte funktion erfuellt. Dies
sind zum Beispiel die Register des VIC-II-Chips, anhand de-
rer bestimmte Funktionen des Video-Chips festgelegt werden,
oder viele Adressen im Bereich von O bis 1023.
11
Zur Manipulation von Binaerzahlen stehen beim Commodore-
BASIC zwei Befehle zur Verknuepfung zweier Binaerzahlen zur
Verfuegung: "AND" und "OR". Die beiden Operatoren bevirken,
dass die beiden Argumente als Binaerzahlen Bit fuer Bit
(insgesamt verarbeiten die Befehle 16 Bits, jedoch mit vVor-
zeichen, was aber beim Arbeiten mit 8-Bit-Zahlen unbeachtet
bleiben kann) verglichen werden und gleichzeitig das Ergeb-
nis aufgebaut wird. Werden zwei Zahlen mittels "OR" ver-
knuepft, so sind in der Ergebnis-Binaerzahl saemtliche Bit-
positionen geloscht, bei denen beide Bitpositionen der bei-
den Argumente geloescht waren, alle anderen Bits sind ge-
setzt. Bei "AND" sind entsprechend alle Bits gesetzt, bei
denen beide Bitpositionen der Argumente gesetzt waren, ande-
re Bitpositionen sind geloescht. Dadurch laesst sich nun be-
wirken, dass innerhalb eines Registers durch "PEEK" und
"POKE" einzelne Bits gesetzt und geloescht werden koennen.
Soll zum Beispiel ein bestimmtes Bit (mit dem Stellenvert N)
an der Adresse A ‚gesetzt werden, so kann dies durch ...
POKE A, PEEK (A) ORN
... erfolgen. Dies erklaert sich daraus, dass jegliche Bits,
die durch "OR" mit dem Ziffernwvert '0' verknuepft werden,
unbeeinflusst bleiben. Wird jedoch eine Verknuepfung durch-
gefuehrt, bei der mindestens eins der beiden Bits gesetzt
ist, so ist auch im Ergebnis dieses Bit gesetzt.
Aehnlich verlaeuft ‘dies beim Loeschen von Bits, was aber nur
mittels "AND" moeglich ist. Wird naemlich ein Bit durch
"AND" mit dem Wert '0O' verknuepft, so ist das Ergebnisbit
auch geloescht. Allerdings muss nun erreicht werden, dass
die uebrigen Bits unbeeinflusst bleiben. Dies ist dann der
Fall, wenn sie bei der "AND"-Verknuepfung mit dem Wert ']'
verknuepft werden. Es muss also nun mit einem Byte gearbei-
tet werden, bei dem das Bit, das geloescht werden soll, den
Bitwert '0' hat, alle uebrigen Bits den Wert ']1'. Entspre-
chend dem Beispiel fuer das Setzen von Bits erreicht man das
Loeschen durch
POKE A, PEEK (A) AND (255 - N)
Die Klammern fuer die Subtraktion dienen nur der Uebersicht
und koennen entfallen, da der Operator '-' einer hoehere
Prioritaet als 'AND' hat und daher auf jeden Fall vorher
ausgefuehrt wird.
Sollen mehrere Bits gleichzeitig entweder gesetzt oder ge-
loescht werden, so kann dies durch Addition der Stellenverte
erfolgen.
Zur Bezeichnung von Binaerziffern und zusammengesetzten Bi-
naerziffern existieren noch weitere gebraeuchliche Begriffe:
So zum Beispiel MSB und LSB (Most/Least Significant Byte):
Ein MSB ist das Byte innerhalb einer Kette von Bytes, dem
der hoechste Stellenwert zukommt. Bei einer Adresse waere
dies das Byte mit den Stellenwerten von 256 bis 32768. Das
LSB ist entsprechend das niederwertigste Byte. Bei Adressen
sind nur zwei Bytes verwendet, jedoch findet sich dieser Be-
griff auch bei der Verwendung von Binaerziffern mit mehr als
16 Stellen (Bits). Die Begriffe MSB und LSB werden jedoch
auch im Zusammenhang mit Bits verwendet. Hierbei ist dann
mit MSB (Most Significant Bit) das hoechstwertige Bit (in-
nerhalb eines oder mehrerer Bytes) gemeint.
Auch gebraeuchlich sind (oft auch im Zusammenhang mit Zahlen
im Hexadezimalsystem oder gepackten BCD-Ziffern) die Be-
zeichnung MSN und LSN, die fuer die Bezeichnung von
"Nybbles" verwendet werden. Ein Nybble ist ein halbes Byte,
also vier Bits. Ein Byte besteht daher aus zwei Nybbles, das
eine besteht aus den Bits der Positionen O bis 3 (LSN), das
andere entsprechend aus den Bits 4 bis 7 (MSN). |
Noch eine kurze Anmerkung zum Hexadezimalsystem: Dieses Zah-
lensystem baut auf der Basis 16 (entsprechend 16 verschiede-
nen Ziffern) auf. Diese Ziffern sind die Zahlen von '0' bis
'9' sowie die Buchstaben von 'A' bis 'F', wobei die Buchsta-
ben fuer die Dezimalwerte von 10 bis 15 stehen. Dieses Zah-
lensystem fand und findet hauptsaechlich auf Einplatinensys-
temen Anwendung, wo die Moeglichkeit einer Programmierung im
Dezimalsystem ein zu aufwendiges Monitorprogramm benoetigen
wuerde (Hexadezimalzahlen lassen sich leichter ins fuer den
Computer verstaendliche Binaersystem umsetzen). Doch mit dem
Aufkommen von groesseren Computern wurde in vielen Faellen
dieses fuer den Menschen doch sehr ungebraeuchliche Zahlen-
system mituebernommen, anstatt dem Programmierer durch Ver-
wendung des Dezimalsystems entgegenzukommen. Mittlerweile
haben sich viele Programmierer fuer die Assemblerprogrammie-
rung im Dezimalsystem entschlossen, da dieses ein wesentlich
komfortableres Arbeiten erlaubt. Das Hexadezimalsystem fin-
det seine Berechtigung nur auf Minimalsystemen und nicht auf
Computern, die im Normalfall (BASIC, PASCAL etc.) sowieso
zum Arbeiten im Dezimalsystem konzipiert sind.
Zurueck zum Binaersystem: Es kann auch vorkommen, dass Dezi-
malzahlen mit Nachkommastellen ins Binaersystem umgewandelt
werden muessen. Hierbei wieder ein Vergleich mit dem Dezi-
malsystem: Die Stelle vor dem Komma (die Einerstelle) hat
ein Zehntel des Wertes der Stelle links davon (Zehnerstel-
le), demnach hat die erste Stelle nach dem Komma den Wert
'0.1', die naechste den Wert '0.01' und so weiter. Im Bi-
naersystem hat demnach die erste Nachkommastelle den Wert
'0.5' (hier wird naemlich durch zwei dividiert, nicht durch
zehn), die zweite Nachkommastelle den Wert '0.25', die
naechste '0.125'. Soll eine Dezimalzahl mit Nachkommastellen
ins Binaersystem umgewandelt werden, so hat zuerst die Unm-
wandlung des Vorkommateils zu erfolgen. Der Nachkommateil
wird nun verdoppelt (die Binaerzahl wird also um eine Ziffer
nach LINKS verschoben). Die Ziffer, die sich nun als Vorkom-
mastelle ergibt (entweder '0' oder '1l'), ist die erste Nach-
kommastelle. Mit dem Nachkommateil dieser verdoppelten Zahl
wird nun genauso verfahren: Verdopplung und Verwendung der
Vorkommastelle als naechste Nachkommastelle. Daraus resul-
tiert natuerlich, dass nicht alle Dezimalzahlen sich abbre-
chend ins Binaersystem umwandeln lassen. So ist zum Bei-
spiel die Dezimalzahl '0.1' eine periodische Binaerzahl:
0.1 (dezimal) = 0.0001100110011001100110011... (binaer)
Ausser der Darstellung von gebrochenen Zahlen wird beim Un-
gang mit Binaerzahlen nun noch die Darstellung von negativen
Zahlen benoetigt: Eine Moeglichkeit der Darstellung von Bi-
naerzahlen ist, das Vorzeichen in Form einer Flag zusammen
mit der Zahl abzuspeichern. Diese Methode wird bei der win-
ternen Darstellung von Fliesskommazahlen beim Commodore-
BASIC (siehe dort) verwendet. Es wird nur der Betrag der
Zahl abgespeichert, aber zusammen mit einem Bit, das angibt,
ob die Zahl positiv oder negativ ist.
13
Bei der gebraeuchlicheren Methode erfolgt die Darstellung in
Form des sogenannten "Zweierkomplements". Erst einmal zum
Begriff der Komplements: das "Einserkomplement" einer Bi-
naerzahl ergibt sich aus der invertierten Darstellung der
Ausgangszahl. Jede Ziffer wird durch die entgegengesetzte
Ziffer dargestellt, die '0' wird durch die '1' ersetzt und
umgekehrt. So ist das Komplement von 'O01101110' gleich
'10010001'. Das Zweierkomplement entspricht nun dem um den
Wert eins erhoehten Einserkomplement. Hierzu ein Beispiel:
12 (dezimal) = 00001100 (binaer)
Einserkomplement von 00001100 (binaer) = 11110011 (binaer)
11110011 (binaer) + 1 (binaer) = 11110100 (binaer)
Wird nun die positive Zahl zu ihrem Zweierkomplement ad-
diert, so ist das Ergebnis gleich null.
Aus dieser Darstellung einer Binaerzahl mit Vorzeichen Te-
sultiert jedoch jetzt, dass Bit 7 (falls nur mit acht Bits
gearbeitet wird) nun nicht mehr den Stellenwert 128, sondern
vielmehr -128 hat. Addiert man nun die Ziffernverte der Zahl
'-12' aus dem obigen Beispiel (-128 + 64 + 32 + 16 + 4), so
erhaelt man auch den korrekten Wert. Auch beim Commodore-
BASIC wird bei den Operatoren "AND", "OR" und "NOT" (dieser
Befehl errechnet das Einserkomplement) mit vorzeichenbehaf-
teten Binaerzahlen gerechnet, jedoch mit Binaerzahlen einer
Breite von sechzehn Bit. Daraus ergibt sich, dass Bit 15
nicht den Wert 32768, sondern -32768 hat (Bit 7 behaelt den
normalen Wert von 128). Wird zum Beispiel eingegeben
PRINT NOT O
... so erhaelt man den auf den ersten Blick unsinnigen Wert
'-1' als Ergebnis. Da jedoch das Einserkomplement von '0'
(oder in Binaer '0000 0000 0000 0000') gleich '1111 1111
1111 1111' ist, erhaelt man nun durch Addition aller Stel-
lenverte den Wert '-1'. Auch die Statusvariable 'ST' wird
als 8-Bit-Zahl mit Vorzeichen angesehen. Dies kann man je-
doch umgehen durch
PRINT 255 AND ST
... da hierdurch der Wert von ST (8 Bits) zuerst in 16 Bits
umgewandelt wird (die Ziffer von Bit 7 wird in die Positio-
nen 8 bis 15 uebertragen), dann werden die Bits 8 bis 15 ab-
geschnitten. Da jedoch bei logischen Operatoren nicht Bit 7,
sondern Bit 15 gesetzt sein muss, um negative Zahlen darzu-
stellen, wird nun der Wert von 'ST' so ausgegeben, als sei
er eine vorzeichrenlose Zahl. Der Wertebereich von 8-Bit-Zah-
len mit Vorzeichen ist -128 bis 127, bei 16-Bit-Zahlen von
-32768 bis 32767 (beim Commodore-BASIC kann die Zahl -32768
als Ergebnis einer logischen Operation auftreten, als Argu-
ment wird sie jedoch durch die Fehlermeldung "?ILLEGAL
QUANTITY ERROR" zurueckgeviesen).
Eine weitere Darstellungsveise fuer Zahlen ist das gepackte
BCD (binary coded decimal) Format (wird im Dezimalmodus der
65er CPUs direkt verarbeitet, andere CPUs besitzen Befehle
zur Anpassung): Hier entspricht jedes Nybble eines Bytes ei-
ner Dezimalstelle. Jedoch nimmt dieses Nybble jetzt nicht
mehr die Werte von O bis 15, sondern nur noch die Werte von
D bis 9 an. Ein Byte, das eine Zahl im gepackten BCD-Format
enthaelt, kann daher jetzt nur noch Zahlen im Bereich von O0
bis 99 enthalten. Zum Beispiel wird die Dezimalzahl '49' im
BCD-Format als '0100 1001' gespeichert. Das MSN hat den Wert
4, das LSN den Wert 9.
14
DARSTELLUNG VON FLIESSKOMMAZAHLEN IM CBM-BASIC
Das BASIC des Commodore 64 bietet die Fliesskommazahlen als
Variablentyp an. Die Darstellung derselben unterscheidet
sich jedoch so stark von der Darstellung von Integervaria-
blen (die problemlos ins Dezimalsystem rueckuebersetzbar
sind), so dass hier gesondert darauf eingegangen werden
soll. Fliesskommawerte werden innerhalb der Variablentabelle
in fuenf Bytes abgespeichert (siehe Darstellung von Varia-
blen). Auf die Bedeutung dieser fuenf Bytes soll im folgen-
den eingegangen werden.
Als Beispiel dient hier die Abspeicherung der Zahl
'-9876.25'. Der erste Umwandlungsschritt ist die Darstellung
dieser Zahl im Binaersystem. Das Vorzeichen bleibt hierbei
unberuecksichtigt, da negative Zahlen nicht in Form des um
eins erhoehten Einserkomplements dargestellt werden, sondern
das Vorzeichen getrennt angegeben wird. Die Zahl '9876.25'
sieht im Binaersystem nun wie folgt aus:
9876.25 (dezimal) = 10011010010100.01 (binaer)
Nun lassen sich Binaerzahlen, wie Zahlen eines jeden anderen
Zahlensystems auch, in Exponentialdarstellung bringen. So
vie die Dezimalzahl ...
25000 zu 2.5E+04
... wird, so laesst sich auch die obige Binaerzahl in Expo-
nentialdarstellung (zur Basis zwei) bringen. Wird nun das
Komma (unter Erhoehung des Exponenten) so verschoben, dass
keine Zahl mehr vor diesem steht (und direkt nach dem Komma
eine eins), so entspricht dies schon im ungefaehren der Dar-
stellung im CBM-BASIC. Die Zahl im obigen Beispiel wuerde
nun wie folgt aussehen:
10011010010100.01 = 0.1001101001010001 E 1110
... saemtliche Zahlen im Binaersystem. Der Exponent ent-
spricht der Dezimalzahl 14, da das Komma schliesslich um 14
Stellen nach links verschoben wurde. Bei einer Verschiebung
nach rechts waere der Exponent negativ. Zu diesem Exponen-
ten wird nun der Wert 128 addiert, man erhaelt das erste
Byte des Variablenverts bei Real-Variablen, aus dem man wie-
derum den Exponenten errechnen kann. Um nun die restlichen
vier Bytes zu erhalten, muss folgendermassen vorgegangen
werden: Man unterteilt die Mantisse der Binaerzahl in vier
Gruppen zu je acht Ziffern (falls nicht genug Ziffern vor-
handen sind, wird der Rest mit Nullen aufgefuellt) und er-
setzt die erste Ziffer (das war der Ziffernwert eins, der
eine Stelle rechts des Kommas stand) im ersten Block mit
acht Ziffern durch die Vorzeichenflag (positiv = 0, negativ
= l). Das Komma kann ab hier entfallen, es ist nur die Zif-
fernfolge von Bedeutung. Hier wieder unser Beispiel
Mantissenziffernfolge: 1001101001010001
In Bloecke unterteilt: 10011010 01010001 00000Nn0N NnoNnOonnan
Ersetzung der ersten Ziffer durch die Vorzeichenflag:
1 0011010 01010001 00CnHAANN AOnananN
In diesem Fall aendert sich die erste Ziffer nicht, da wir
ja von einer negativen Zahl ausgegangen sind. Waere die Zahl
positiv,-so waere die erste Ziffer eine Null.
15
Die nun folgenden Umwandlungsschritte macht der Rechner nun
nicht mehr mit, da er selbst ja normalerweise auch im Bi-
naersystem arbeitet und so die Zahlenbloecke nicht mehr zur
veiteren Verarbeitung ins Dezimalsystem konvertieren muss.
Wie gesagt werden diese vier Bloecke zu acht Ziffern (Bits)
nun ins Dezimalsystem umgewandelt. Man erhaelt so die weite-
ren vier Bytes des Variablenwerts. Im Endeffekt wird unsere
Zahl (falls sie einer Variablen zugeviesen wird) abgespei-
chert als
142 154 81 0 0
Das erste Byte ist der (Binaer-) Exponent (zur Basis 2, um
128 erhoeht), der Rest stellt die Mantisse und das Vorzei-
chen dar.
Die Zahlendarstellung in den Rechenregistern (FAC und ARG,
auch Fliesskommaakkumulatoren #1l und #2 genannt) des Be-
triebssystems ist ein wenig anders. Hier wird das fuer das
Vorzeichen zustaendige Bit wieder durch eine eins ersetzt
und das Vorzeichen selbst in einer getrennten Zeropage-
Adresse abgespeichert. Zusaetzlich besitzt FAC (Floating-
point ACcumulator) im Unterschied zu ARG (floatingpoint
ARGument) noch eine Rundungsstelle, die einem fuenften Man-
tissenbyte gleichkommt.
16
DARSTELLUNG UND ABLAGE VON VARIABLEN
Die Variablen werden im Commodore-BASIC in drei Bloecken va-
riabel verwaltet. Es handelt sich dabei um die einfachen
(nichtindizierten) Variablen, die indizierten Variablen,
Felder oder Arrays genannt, sowie die Inhalte der Stringva-
riablen, die in einem weiteren Datenblock verwaltet werden.
Der erste Block liegt direkt hinter dem BASIC-Programm, wo-
durch auch klar wird, warum Variablen durch Programmaende-
rungen geloescht werden - es werden beim Einbau von Pro-
grammzeilen die Variablen einfach ueberschrieben. Der Point-
er (45/46) zeigt auf den Beginn des Variablenbereichs, das
Ende wird durch den Anfangspointer auf den Block mit den in-
dizierten Variablen bestimmt, die direkt hinter den nichtin-
dizierten stehen. Diese Startadresse der Feldvariablentabel-
le wird durch den Pointer (47/48) festgelegt. Die Endadresse
(plus eins, wie alle Endpointer) steht in (49/50).
Die Tabelle der nichtindizierten Variablen ist in Eintraege
zu je sieben Bytes aufgeteilt, die den Variablennamen und
den Inhalt (beziehungsweise den Pointer auf den Inhalt) ent-
halten. Bei den Eintraegen handelt es sich um die Real-Vari-
ablen, die Integer-Variablen, die Strings sovie die mittels
'DEF' definierten "Variablen". Der Aufbau eines Eintrags in
folgender Tabelle in einer Uebersicht:
Typ [Byte O|Byte 1|Byte 2 [Byte 3 |Byte 4 | Byte 5 |Byte 6
real| reset Variablenwert von MSB bis LSB
Startadresse ILH|
Startadresse LH| Variablenp. LH
Der Variablenname steht in den ersten beiden Bytes, und da
Zeichen des Variablennamens nur Buchstaben oder Zahlen sein
duerfen, wird Bit 7 zusaetzlich zur Markierung des V\Varia-
blentyps verwendet. Die Angabe 'set' beziehungsweise 'reset'
bezieht sich also auf Bit 7 des Variablennamens. Die wveite-
ren fuenf Bytes geben, sofern benutzt, den Variablenvert an.
Die Aufteilung dieser fuenf Bytes bei den Reals und Integers
bedarf keiner weiteren Erklaerung.
Die Angabe 'Startadresse LH' bei Eintraegen von Stringvaria-
blen bezieht sich auf die Startadresse (erst low, dann hiah)
des Stringinhalts, der entweder im Programm (bei Direktzu-
weisungen) oder am Ende des Arbeitsspeichers liegen kann
(Stringoperationen oder Eingaben). Ist die Stringlaenge
gleich null, so ist die Startadresse natuerlich egal.
FN-Variablen enthalten einerseits den Pointer auf den Aus-
druck, der auszuwerten ist, sowie den Pointer auf die FN-Va-
riable, die im Ausdruck verwendet wird. Beim Aufruf einer
selbstdefinierten Funktion wird der Inhalt der FN-Variablen
gerettet, das Argument des FN-Ausdrucks in die Variable
uebertragen, der Ausdruck ausgevertet (bei Fehlern im Aus-
druck wird die Zeilennummer, in der das FN steht, ausgege-
ben, nicht die des FN-Ausdrucks) und zur weiteren Verwendung
in FAC uebertragen. Danach wird der Inhalt der FN-Variablen
wiederhergestellt und das Programm an der Stelle hinter dem
FN-Aufruf fortgesetzt.
Das Suchen und Anlegen von Variablen kann durch die Routine
'"VARSUC' (ab 45195) durchgefuehrt werden.
17
Der Block am Ende des Arbeitsspeichers enthaelt die String-
inhalte, sofern sie nicht direkt im Programm zugewiesen wur-
den. Diese Stringinhalte reichen bis zum Ende des Arbeits-
speichers (Endadresse im Pointer (55/56)) und werden nach
unten hin angebaut. Saemtliche Zwischenergebnisse bei
Stringoperationen werden abgespeichert und dann zu weiteren
Berechnungen herangezogen. Ist ein Ausdruck ausgewertet, so
verden die "Reste", die Zwischenergebnisse und frueheren
Stringinhalte, nicht beseitigt, sondern unveraendert im
Block gelassen, dessen Anfang, festgelegt durch den Pointer
(51/52), sich immer weiter in Richtung der Variablentabelle
bewegt. Wird nun beim Einbau einer neuen Variablen, eines
Variablenfeldes oder eines weiteren Strings mehr Platz be-
noetigt, als momentan verfuegbar ist, so werden diese un-
gueltigen Strings durch eine Routine namens "GARBAGE
COLLECT" (woertlich uebersetzt: Abfallsammlung) beseitigt.
Ist nun immer noch nicht genug Platz vorhanden, so wird ein
"OUT OF MEMORY" ausgegeben, ansonsten wird die Ausfuehrung
normal fortgesetzt. GARBAGE COLLECT kann durch die Funktion
'FRE(O)' erzwungen werden.
Man sollte uebrigens, wenn ein Programm grosse Felder ver-
vendet, aus Zeitgruenden normale Variablen VOR der Dimensio-
nierung von Feldern anlegen, da sonst, um eine Variable ein-
zufuegen, der gesamte Block mit Feldvariablen durch eine
sehr zeitaufwendige Routine um sieben Bytes nach oben ver-
schoben werden muss.
Nun zum Aufbau von Feldern: Eintraege einzelner Elemente von
Feldvariablen sind, im Gegensatz zu nichtindizierten Varia-
blen, unterschiedlich lang. 50o benoetigt eine Realvariable
zwar, wie sonst auch, fuenf Bytes, um den Wert darzustellen,
Integer- und Stringvariablen jedoch werden nun nicht mehr
mit Nullen aufgefuellt, sondern nur noch so lang abgespei-
chert, wie Werte verwendet werden; zwei Bytes bei Integerva-
riablen und drei Bytes bei Strings.
Zu Beginn eines Feldes steht der sogenannte Arrayheader, ein
Kopfeintrag, der die Informationen ueber das Feld enthaelt.
Dies sind Angaben ueber die Anzahl Dimensionen, die Spalten-
laenge(n), die Feldlaenge und natuerlich der Name des Fel-
des. Auch hier sind die Namensmarkierungen identisch denen
bei nichtindizierten Variablen, auch wenn es natuerlich kei-
ne Felder vom Typ 'FN' gibt. Ist das zweite Byte eines Va-
riablennamens nicht benutzt, so wird auch hier der Code 0
beziehungsweise 128 (abhaengig vom Variablentyp) als zweites
Zeichen gespeichert.
Hier ein schematischer Aufbau des Arrayheaders:
Byte O0 |Byte 1 |Byte 2 | Byte 3 |Byte 4 |Byte 5 |Byte 6
erstes | zweites| Feldlaenge in Anzahl | Spaltenlaenge
Zeichen! Zeichen] LH Darstellung | Dimens.| HL Darstellung!
Byte 5 und 6 werden, je nach Anzahl an Dimensionen, wieder-
holt. Dabei muss beachtet werden, dass die letzte Spaltenan-
gabe beim DIM-Befeh]l als erster Eintrag abgespeichert wird.
Ausserdem wird die Spaltenlaenge und nicht die Zahl beim
DIM-Befehl im Arrayheader eingetragen, da schliesslich noch
ein Element mit dem Index Null existiert (der Wert im Kopf-
eintrag ist also um eins hoeher als der Parameter im DIM-Be-
fehl).
18
Hierzu ein Beispiel: ein Stringfeld soll durch folgenden
DIM-Befehl angelegt werden:
DIM X5$ (2,5,567)
Das Feld wird nun folgendermassen im Arbeitsspeicher abge-
legt:
Feldadresse Inhalt Bedeutung
plus ...
0 88 Code fuer "X" (Bit 7 geloescht)
1 181 Code fuer "5" (Bit 7 gesetzt)
2 219 Feldlaenge in Low/High Darstellung
3 119 (ist hier gleich 30683)
4 3 Anzahl an Dimensionen des Feldes
5 2 Wert 568 fuer Spaltenlaenge
6 56 (High/Low Darstellung!)
7 0 Wert 6 fuer Spaltenlaenge
8 6
9 0 Wert 3 fuer Spaltenlaenge
10 3
ll - Stringlaenge fuer Element (0,0,0)
12 - zugehoerige Startadresse in
13 - Low/High Darstellung
... San 10222 weitere Stringelemente
30680 - Stringlaenge fuer Element (2,5,567)
30681 - zugehoerige Startadresse in
30682 - Low/High Darstellung
Die Zaehlweise der Elemente innerhalb des Feldes geht fol-
gendermassen vor sich: Die erste Spalte ist die "niedervwer-
tigste Spalte", die letzte die "hoechstvertigste". Der auf
den ersten Eintrag im obigen Beispiel folgende Eintrag waere
der des Elements (1,0,0), darauf (2,0,0) und dann (0,1,0)
und so weiter.
Nun ist es auch einfach, eine Methode zur Berechnung der
Laenge eines Feldes zu entwickeln. Man multipliziert die um
eins erhoehten (Null-Eintrag!) Parameter des DIM-Befehls
miteinander, multipliziert dies mit der Laenge eines Ein-
trags (Real = 5, String = 3, Integer = 2) und addiert dazu
den Wert fuenf und die doppelte Anzahl Dimensionen. Das obi-
ge Feld belegt nach dieser Formel
(2+1) * (5+1) * (567 +1) * 3+5+3%*2
; gleich 30683 Bytes. Dies ermoeglicht es in Programmen,
den Anwender auf eine freundlichere Art als "OUT OF MEMORY"
darauf aufmerksam zu machen, dass der Arbeitsspeicher nicht
ausreicht. Man muss vor Ausfuehrung des DIMs nur die Feld-
laenge mit dem noch freien Platz vergleichen.
19
DIE VERWENDUNG DER USR-FUNKTION
Das Commodore-BASIC verfuegt ueber eine Funktion mit dem Na-
men "USR". Waehrend man im Normalfall durch Verwendung die-
ser Funktion nur einen "?ILLEGAL QUANTITY ERROR" erzielen
kann, so koennen durch Maschinenprogramme der "USR"-Funktion
viele Bedeutungen (fast) aller Art zugeviesen werden. Eine
dieser speziellen Aufgaben ist zum Beispiel die "PEEK"-Funk-
tion, die immer den Inhalt des RAMs liest (siehe Speicher-
verwaltung). Auch das Arbeiten mit der internen Uhr (siehe
CIA, Time of Day) erfaehrt eine erhebliche Vereinfachung,
wenn man ein geeignetes Programm zur Bedienung der Uhr an-
wendet. Um ein problemloses Implementieren eigener Funktio-
nen so einfach wie moeglich zu machen, hier eine Beschrei-
bung:
Die Funktion "USR" ist eine Funktion wie jede andere auch,
sei es nun eine mathematische Funktion wie "SIN" oder "EXP",
eine spezielle Funktion im Zusammenhang mit Strings (zum
Beispiel "VAL" oder "CHR$") oder nur etwas systemspezifi-
sches wie "PEEK" oder "FRE". Allen diesen Funktionen, deren
Interpretercodes im Bereich von 180 bis 199 liegen, ist ge-
meinsam, dass sie EIN Argument benoetigen, auch wenn es (vie
im Falle von "POS" und "FRE") nicht beachtet wird, dessen
Typ (numerisch oder String) festgelegt ist. Alle diese Funk-
tionen liefern ausserdem EIN vom Typ her festgelegtes Ergeb-
nis.
In der gleichen Weise funktioniert die "USR"-Funktion auch.
Man gibt ein Argument mit und erhaelt ein Ergebnis. Der je-
weilige Typ (sowohl Argument, als auch Ergebnis) wird durch
das zugehoerige Maschinenprogramm festgelegt und kann nicht
nur, wie dies besonders in Literatur zum PET und zu den CBMs
immer wieder behauptet wird, im Integerbereich von -32767
bis 32767 liegen.
Die vom Betriebssystem festgelegte Startadresse der USR-
Funktion ist 784 (siehe Vektortabelle der BASIC-Funktionen).
Dort befindet sich aber der sogenannte USR-Vektor, also, ein
"JMP", dessen Argument vom Benutzer festzulegen ist. Im Nor-
malfall zeigt das Argument dieses "JMP"-Befehls (Code 76,
dezimal) auf die Fehlermeldung "?ILLEGAL QUANTITY ERROR",
vodurch dieser Fehler auch bei Nichtsetzen des USR-Vektors
und Benutzung des Befehls auftritt. Soll also das Maschinen-
programm zur Definition der USR-Funktion beispielsweise an
der Adresse 828 (Cassettenpuffer) beginnen, so muss dies dem
Computer durch
POKE 785, 60 : POKE 786, 3
... mitgeteilt werden. Die Reihenfolge der Abspeicherung ist
natuerlich low/high. Nun zur Struktur von Funktionen im all-
gemeinen:
Das Betriebssystem wertet beim Erkennen einer Funktion (die
Funktionen LEFT$, RIGHT$ und MID$ bilden eine Ausnahme, da
sie mehrere Argumente benoetigen) das im Klammern stehende
Argument, unabhaengig vom Typ des Arguments, aus. Sollte. es
sich bei dem Argument um einen numerischen Ausdruck handeln,
so wird diese Zahl im Fliesskommaaccu #1 (Floatingpoint
ACcumulator, FAC) abgelegt. Dabei handelt es sich um das
Hauptrechenregister des Microsoft-BASICs. Dieses Argument
kann dann durch Betriebssystemroutinen entsprechend weiter-
verarbeitet werden. Eine Unterscheidung zwischen Realzahlen
und Integerzahlen wird hier nicht gemacht.
20
Handelt es sich jedoch um ein Argument des Typs String, so
wird der Descriptor (bestehend aus drei Bytes, die die Laen-
ge und Startadresse festlegen) dieses Strings in die De-
scriptortabelle gebracht. Durch die Routine "FRESTR" (Ein-
sprungadresse 46755) wird zuerst geprueft, ob es sich bei
dem Argument auch um einen String handelt. Daraufhin wird
der durch den String belegte Speicherbereich wieder freige-
geben und der Pointer (34/35) auf die Startadresse des
Strings gesetzt. Der Accu enthaelt nach Rueckkehr die
Stringlaenge.
Mit diesen Angaben kann nun die Auswertung beginnen: Als
Beispiel soll hier eine mathematische Funktion dienen: die
im Commodore-BASIC nicht implementierte Umkehrfunktion zur
SINUS-Funktion. Die Umrechnungsformel lautet
ARC SIN (X) = ATN (X / SQR (1-X*xX))
Sollen von Maschinensprache aus Funktionen ausgevertet ver-
den, so muss das Argument sich in FAC befinden. Nach Aufruf
durch "JSR" befindet sich ebenfalls in FAC das Ergebnis.
Fuer Operationen wie "-" oder "*" muss anders vorgegangen
verden. Hier muss der erste Wert in das Rechenregister ARG
(floatingpoint ARGument) uebertragen verden, der zweite Wert
zur Ausfuehrung der Operation befindet sich (vie das Ergeb-
nis der Operation auch) in FAC. Es muss also die Funktion
zerlegt werden, aehnlich wie sie auf einem UPN-Taschenrech-
ner eingegeben wuerde.
Nun die theoretische Vorgehensweise zur Berechnung dieser
Funktion (das Argument "X" befindet sich in FAC):
"X" muss quadriert werden, also wird FAC in ARG kopiert und
dann FAC mit ARG multipliziert, Ergebnis bereits in FAC.
Dieses Ergebnis muss nun von der Zahl "]" subtrahiert wer-
den. Dazu wird die Konstante "1" in ARG wuebertragen, davon
wird FAC, der das Ergebnis der vorherigen Operation ent-
haelt, subtrahiert.
Daraus wird die Wurzel gezogen, was einfach durch Aufruf der
"SQR"-Routine erfolgen kann. Nun muss das in FAC abgelegte
Zwischenergebnis durch "X", also das urspruengliche Argu-
ment, geteilt werden. Da dieses Argument aber mittlerweile
nicht mehr verfuegbar ist, muss es also zu Beginn des Ma-
schinenprogramms in einen Bereich webertragen werden, der
durch keine bis hierhin verwendete Berechnung ueberschrieben
wird. Dieses gerettete Argument wird sodann in ARG uebertra-
gen und die Divisionsroutine aufgerufen.
Zum Abschluss erfolgt ein Sprung zur "ATN"-Routine, die dann
noch den Arcustangens in FAC bringt. Da das Endergebnis ei-
ner Funktion sich in FAC befinden muss, ist keine weitere
Behandlung des Ergebnis der "ATN"-Routine mehr noetig.
21
Hier nun das Maschinenprogramm zur Ausfuehrung der Berech-
nung:
828 LDX #0 (XR/YR) := 256
830 LDY #
832 JSR 48084 > FAC nach 256 bis 260 retten
835 JISR 48140 > FAC nach ARG uebertragen
838 LDA 97 Exponentbyte in Accu fuer Nullpruefung
840 JSR 47659 > FAC := ARG * FAC
843 LDA #188 (Accu/YR) := 47548
845 LDY #185 Startadresse der Konstanten "1"
848 JSR 47184 ) FAC := Konstante / FAC
851 JSR 49009 > FAC := SQR (FAC)
854 LDA #0 (Accu/YR) := 256
856 LDY #1 Startadresse des geretteten Arguments
858 JSR 47887 > FAC := Konstante / FAC
861 JMP 58126 > FAC := ATN (FAC)
Das zugehoerige BASIC-Programm zum Einlesen der Maschinen-
routine:
100 FOR I = 828 TO 862 : READ A : POKE I, A : NEXT
110 POKE 785, 60 : POKE 786, 3
120 DATA 162, , 160, 1, 32, 212, 187, 32, 12, 188, 165, 97
130 DATA 32, 43, 186, 169, 188, 160, 185, 32, 80, 184, 32
140 DATA 113, 191, 169, , 160, 1, 32, 15, 187, 76, 14, 227
Vielleicht ist es Ihnen aufgefallen, dass nicht der Typ des
Arguments geprueft wurde. Dieser kann durch den Inhalt der
Adresse 13 (siehe Memory Map) oder durch Aufruf der entspre-
chenden Routine zur Pruefung des Ausdrucktyps festgestellt
verden. Dies ist jedoch nicht noetig, da die Adresse )3
durch Berechnungen nicht geaendert wird. Daher ist nach Be-
endigung der Berechnung diese Flag im Falle eines Stringar-
guments noch immer auf "String" gesetzt. Da jedoch bei die-
ser Funktion ein numerisches Ergebnis erwartet wird, erfolgt
die Ausgabe von "?TYPE MISMATCH ERROR", falls ein Stringar-
gument mitgegeben wurde.
Hat eine Funktion ein Ergebnis des Typs String, so muss an-
ders vorgegangen werden, da eine direkte Rueckkehr zur auf-
rufenden Auswertungsroutine mittels "RTS" nur bei numeri-
schem Resultat erfolgen darf. Zuerst muss fuer den Ergebnis-
string der Funktion Platz im Arbeitsspeicher geschaffen vwer-
den. Zu diesem Zeitpunkt muss die Laenge des Ergebnisstrings
bekannt sein, da bei Aufruf der Routine 46205 der Accu die
Laenge enthalten muss. Entsprechend dieser Angabe wird dann
Platz im Arbeitsspeicher geschaffen. Registerpaar (98/99)
zeigt dann auf die Startadresse dieses Bereichs. Ist alles
abgespeichert worden, so muss nun die Ruecksprungadresse in
die Auswertungsschleife mittels "PLA", "PLA" vom Stack ge-
holt werden. Durch "JMP 46282" wird dann der Descriptor :des
im oberen Stringbereich abgelegten Strings in die Descrip-
tortabelle gebracht. Ein verstaendliches Beispiel fuer die-
ses Prinzip ist die Funktion "CHR$" ab der Adresse 46828.
22
STEUERCODES FUER DEN COMMODORE 64
000: - 128: -
001: - 129: ORANGE: Cursorfarbe orange
002: - 130: -
C03: RUNSTOP 131: Shift RUNSTOP
004: - 132: -
005: WHITE: Cursorfarbe weiss 133; Fl Codes fuer die
006: - 134: F3 Funktionstasten
007: - 135: F5
008: Shift + Commodore blockieren 136: F7
009: Shift + Commodore freigeben 137: F2
010: - 138: F4
Oll: - 139: F6
0l2: - 140: FB
013: RETURN 141: Shift RETURN
014: Gross- und Kleinschrift 142: Grossschrift und Graphik
015: - 143: -
016: - 144: BLACK: Cursorfarbe schwarz
017: CURSOR DOWN: Cursor nach unten 145: CURSOR UP: Cursor nach oben
018: REVERS DON: Negativdruck 146: REVERS OFF: Positivdruck
019: HOME: Cursor nach oben links 147: CLEAR SCREEN: Bildschirm loeschen
020: DELETE: Zeichen loeschen 148: INSERT: Zeichen einfuegen
021: - 149: BROWN: Cursorfarbe braun
022: - 150: LT. RED: Cursorfarbe rosa
023: - 151: GRAY 1: Cursorfarbe dunkelgrau
024: - 152: GRAY 2: Cursorfarbe mittelgrau
025: - 153: LT. GREEN: ”’Cursorfarbe hellgruen
026: - 154: LT. BLUE: Cursorfarbe hellblau
027: - 155: GRAY 3: Cursorfarbe hellgrau
028: RED: Cursorfarbe rot 156: PURPLE: Cursorfarbe purpur
029: CURSOR RIGHT: Cursor nach rechts 157: CURSOR LEFT: Cursor nach links
030: GREEN: Cursorfarbe gruen 158: YELLOW: Cursorfarbe gelb
031: BLUE: Cursorfarbe blau 159: CYAN: Cursorfarbe cyan
Nichtaufgefuehrte Codes haben in der Standardversion des Betriebssystems
keinerlei Wirkung.
Saemtliche angegeben Steuercodes sind ueber die CHR$-Funktion sowie, von 142
abgesehen, auch ueber die Tastatur erreichbar.
Die Codes 013, 131, lM41 und im Normalfall auch 020 und 148 werden immer
ausgefuehrt und bewirken keine Ausgabe von Steuersymbolen. Sie sollten bei
verwendung in Programmen daher ueber der CHR$-Funktion programmiert werden.
Die Codes 003, 131 sowie 133 bis 140 (Funktionstasten) haben bei der Ausgabe
keinerlei Funktion und finden daher im Normalfall wohl nur zur Abfrage der
Tasten Verwendäng. Lediglich der Code 13] hat ueber die Programmierung des
Tastaturpuffers die Funktion, die er auch im Normalfall hat, das Einladen und
Starten von Cassettenprogrammen.
Die Codes von 000 bis 031 sind unter anderem auch durch Druecken der
Control-Taste zusammen mit einer der Tasten von "WW", "A" bis "zZ", ":", *"Pound',
„,;", "&" und "=" erreichbar, es gelten jedoch auch hier die oben gemachten Ein-
schraenkungen.
23
STELERCODES IN LISTINGS
Waehrend zich heim FET 2001 die Anzahl der Steuercades mach
im Rahmen hielt, sc sikt es keim Commadore 854 schan insge-
samt 42 Codes, die irgendeine Bedeutung haken. Besonders
keim Eintippen von Listings ist es notwendig. das Steuerzei-
chen mit der Taste (die diesen [ode erzeugt) in Verkindung
zu krinrgen. Deshalk eine Aufstelluna aller »erwendeten Steu-
erccdes: Es wird jeweils das pasitive zum besseren Erken-
nen» und das neastive Zeichen “dss in den Listings vorkommt)»
ansgegeker. Ruch werden keide Darstellunasmodi Graphik und
Kleinschrift> beruecksichtist:
-— RUNSTOP
-— Control E-
— Contrcl H
— Control I.
Control N
- Control D, CURSOR DOuN
- Control R., Control 93
—-— Control S. HOME
-— DELETE. CHF$i\ 20)
- Control £. Cantrol 23
—-— Cantraoal :, CURSOR RIGHT
- Cantrcal - Control &
- Control =, Control 7
- Commodore 1
-— Shift-RUNSTOP
- Fi
- F3
- FS
- F7
- F2
- Fa
- Fö
- FS3
CHR$U142)
- Control 1
— CURSOR UP
- Control 8
— CLEAR SCREEN
— INSERT. CHR$ 1485
- Commodore
—- Commodore
- Commodore
—-— Lommadeore
- Commodare
- Commodore
- Commodore
- Control 5
- CURSOR LEFT
- Control 3
-— Control 4
Central 2
Es U nd 29 ed u Bu Li [al
|
+Nn I2I3I-Fon
IIStrt>u AWO ZITIMN
I >
«
)
r
[
“
“._
ANIO TDTZTFTR“MHM TOTNTMNID
WE Ge ee a [ee En Di Isa Ei Ina ma ia iz ER En = I a an I bi
|
u
KE<
N-
BR,
FDBSEUBSSEU AMELIE EN EEE u IE I BR EI bi ED a ei ee Du Be I I
DNS Bw m
A3—- "HR _LIUNX-
De
PR
24
EINFUEHRUNG IN DIE ASSEMBLER-PROGRAMMIERUNG
Das "Herz" eines jeden Mikrocomputers ist der Mikroprozes-
sor. Im VIC 20 ist ein Mikroprozessor des Typs "6502" einge-
baut, im Commodore 64 ein "6510". Beide sind bezueglich der
Programmierung in Assembler voellig identisch.
Jeder Mikroprozessor kann eine bestimmte Anzahl von genau
definierten Assembler-Anweisungen verstehen und ausfuehren,
etwa so, wie ein BASIC-Interpreter bestimmte BASIC-Befehle
verarbeiten kann. Derjenige, der diese Assembler-Anweisungen
beherrscht, kann also direkt den Mikroprozessor program-
mieren.
Programme, die in Assembler geschrieben sind, laufen wesent-
lich schneller ab als in BASIC und koennen die Moeglich-
keiten des Computers viel besser ausnutzen. Fuer jeden fort-
geschrittenen Programmierer ist daher die Beherrschung der
Assembler-Sprache unerlaeßlich.
Um erfolgreich in Assembler programmieren zu koennen, ist es
wichtig, den Aufbau des Computers zu kennen.
Jeder Computer besteht aus einer Vielzahl von kleinen
Schaltern, die entweder offen sind (es fließt kein Strom)
oder geschlossen (es fließt Strom). Natuerlich handelt es
sich dabei nicht um mechanische Schalter, sondern vielmehr
um Schaltelemente, die in IC-Bausteinen ("Chips") unterge-
bracht sind. Einen solchen einzelnen Schalter nennt man
"Bit" und statt "offen" und "geschlossen" redet der Fachmann
von zwei "Zustaenden", die er "0" und "1" nennt. Ein solches
System heißt "binaer", "zweier Zustaende faehig".
Der 6502/6510 Mikroprozessor ist derart aufgebaut, daß er
jeweils 8 Bits gleichzeitig verarbeitet. Eine solche Einheit
von B Bits nennen wir "Byte". Ein Beispiel fuer ein Byte ist
"00110101".
l Byte = (z.B.) 0011071071
Bit Nummer 65 43 210
Wie Sie sehen, werden die einzelnen Bits eines Bytes von
rechts nach links von O0 bis 7 durchnumeriert.
Nun ist der gesamte Computerspeicher aufgebaut aus einzelnen
"Speicherzellen", wobei jede Zelle genau ein Byte groß ist.
Sie koennen sich das ungefaehr so vorstellen:
Speicherzelle 0: 10101010 = 8 Bit = 1 Byte
Speicherzelle 1: 01101101
Speicherzelle 2: 00011001
Speicherzelle 655335: 01000011
Die Bytes unterscheiden sich dadurch voneinander, daß sie
zum Teil unterschiedliche Bitkombinationen (z.B. "01000011")
enthalten. Man redet auch davon, daß ein Bit "gesetzt" (= ])
oder "geloescht (= 0) ist. Die in der Skizze genannten Bit-
kombinationen sind willkuerlich gewaehlt.
Da 8 Bits nur 256 verschiedene Kombinationen darstellen
koennen, kann der Mikroprozessar 6502/6510 grundsaetzlich
nur Zahlen von 0 bis 255 bearbeiten (s. auch Kapitel
"Binaerarithmetik").
25
Kombination 0: 0000000
Kombination 1: 0000001"
Kombination 2: 00000710
Kombination 3: 0000011
Kombination 4: 0000100
Kombination 255: 1l1ı1l1 111
Sie sehen, daß jeder Bitkombination, also jedem Byte, ein
bestimmter dezimaler Wert von O bis 255 zugeordnet ist. Wenn
Sie z.B. "POKE3,255" eingeben, so bedeutet das nichts
anderes, als daß in die Speicherzelle 3 die Bitkombination
"11111111" eingeschrieben wird.
Der Speicher besteht aus einzelnen Speicherzellen von der
Groeße eines Bytes, die prinzipiell voellig gleich sind. Wir
unterscheiden jedoch unterschiedliche Funktionsbereiche wie
Programm- und Variablenspeicher, Betriebssystem- und BASIC-
Interpreter-Bereich, Ein-/Ausgabespeicher, Betriebssystem-
zwischenspeicher u.a. Das vorliegende Buch erlaeutert die
Arbeitsweise jedes einzelnen Funktionsbereiches im Detail.
Dabei gibt es sog. "RAM-Speicher" und "ROM-Speicher". "RAM"
bedeutet, daß Daten eingeschrieben und auch wieder gelesen
werden koennen (z.B. Programm- und Variablenspeicher), "ROM"
hingegen meint, daß der betreffende Speicherbereich aus-
schließlich gelesen, nicht aber durch anderen Daten ueber-
schrieben (veraendert) werden kann (z.B. BASIC-Interpreter).
Machen Sie sich klar, daß der gesamte Computerspeicher aus
einzelnen Speicherzellen besteht, die wiederum Zahlen bein-
halten. Diese Zahlen haben allerdings ganz verschiedene
Bedeutungen, es kann sich um ein BASIC-Programm handeln,
oder um ein Assembler-Programm, oder auch um Daten.
Sehen wir uns nun - ausgeruestet mit einem Minimum an
theoretischen Wissen - das erste Assembler-Programm an. Um
das Programm in den Computer eingeben zu koennen, benoetigen
wir noch ein sog. "Assembler-System", das unsere Assembler-
Anweisungen in reinen Zahlencode umsetzt. Sie finden ein
solches - allerdings sehr einfaches Assembler-System - im
Anschluß an dieses Kapitel. Es ist sicher sinnvoll, wenn Sie
sich zunaechst dort mit der Bedienung vertraut machen. Sie
koennen dann gleich die erklaerten Beispiele nachvollziehen.
Commodore 64 VC-20 (bis 8K) VC-20 (groeßer BK)
828 LDA #65 828 LDA #65 828 LDA #65
830 STA 1024 830 STA 7680 830 STA 4096
833 LDA #3 833 LDA #3 833 LDA #3
835 STA 55296 835 STA 38400 835 STA 37888
838 RTS 838 RTS 838 RTS
Um das Programm auszuprobieren, geben Sie von BASIC aus SYS
828 (RETURN) ein. Es sollte sodann ein Zeichen in der linken
oberen Bildschirmecke zu sehen sein.
Jeder Assembler-Schritt besteht aus:
828 LDA #65
Adresse Assemblerbefehlswort Argument
("auch Mnemonic")
26
Die "Adresse" gibt an, ab welcher Speicherzelle die
Assembler-Anweisung beginnt. Es existieren insgesamt 65536
verschiedene Speicherzellen, die die Adressen von 0 bis
65535 tragen. Jede Assembler-Anweisung belegt je nach Befehl
l bis 3 Bytes. Der Adresse folgt das eigentliche Assembler-
Befehlswort, im Beispiel "LDA". Sie finden in diesem Buch
ein Verzeichnis aller gqueltigen Befehlsworte. Dem Befehls-
wort kann - je nach Befehl - noch ein Argument folgen, in
unserem Beispiel "Doppelkreuz 65". Es gibt auch Assembler-
Anweisungen ohne Argument. Schließlich existieren ja auch in
BASIC Befehle mit und ohne Argument (z.B. POKE mit zwei
Argumenten, STOP ohne Argument).
Das Befehlswort "LDA" steht fuer "load accumulator", "Lade
Akkumulator", oder in diesem Fall "Lade Akkumulator mit dem
Wert 65". "STA" bedeutet "store accumulator", "speichere
Akkumulator an der angegebenen Adresse ab".
Um das verstehen zu koennen, muessen Sie wissen, daß es in
Assembler im Unterschied zu BASIC keine Variablen gibt. Als
Ersatz dafuer existieren in Asembler drei "Register",
naemlich "Akkumulator", "X-Register" und "Y-Register". Ein
solches Register kann Werte von 0 bis 255 beinhalten. Jetzt
koennen Sie das Programm verstehen (beispielhaft fuer den
Commodore 64):
828 LDA #65 ;sAkkumulator mit dem Wert 65 laden
830 STA 1024 ;sdiese 65 in Speicherzelle 1024 speichern
833 LDA #3 sAkkumulator mit dem Wert 3 laden und
835 STA 55296 sdie 3 in Speicherzelle 55296 speichern
838 RTS ;sbeendet jedes Assembler-Programm
Beachten Sie die Bedeutung des Doppelkreuz-Zeichens: Der
Akkumulator wird direkt mit dem Wert 65 geladen (und nicht
mit dem Wert, der in der Speicherzelle 65 steht, was auch
moeglich waere). Hingegen wird diese 65 dann in Speicher-
zelle 1024 abgespeichert. Die Anweisung RTS ("return from
subroutine", "Rueckkehr aus einer Unterroutine") muß unbe-
dingt am Ende jedes Assemblerprogramms stehen. Andernfalls
geraet der Computer im allgemeinen in einen voellig wunkon-
trollierten Zustand ("Absturz"), da er versucht, weitere An-
weisungen auszufuehren, obwohl kein gueltiger Assemblercode
mehr vorhanden ist.
Warum unser Programm ein Zeichen auf dem Bildschirm ausgibt?
Nun, Speicherzelle 1024 (Commodore 64) entspricht der linken
oberen Bildschirmposition (Zeichencode), Speicherzelle 55296
bestimmt die Farbe eben dieser Position. Experimentieren Sie
selbstaendig in dieser Richtung, indem Sie statt 65 andere
Werte zwischen O0 und 255 nehmen, statt der 3 andere Werte
von O bis 7 (VIC 20) bzw. von O bis 15 (Commodore 64).
Assembler BASIC
828 LDA #65 828 A = 65
830 STA 1024 830 POKE 1024, A
833 LDA #3 833A= 3
835 STA 55296 835 POKE 55296, A
838 RTS 838 END
Natuerlich existieren in Assembler noch eine Vielzahl
anderer Befehlsworte. Ein Teil davon ist den bereits
gelernten so aehnlich, daß Sie sie sofort verstehen werden.
27
Fuer das X- und Y-Register lauten die Befehlsworte zum Laden
und Abspeichern wie folgt:
Assembler Funktion BASIC-Entsprechung
LDX #wert laedt X-Register X = wert
STX adresse speichert X-Register POKE adresse, X
LDY #wert laedt Y-Register Y= wert
STY adresse speichert Y-Register POKE adresse, Y
X- und Y-Register sind - genau wie der Akkumulator - interne
Register des Mikroprozessors von der Groeße eines Bytes. Sie
koennen also Zahlen von O bis 255 enthalten.
Um einen Text auf dem Bildschirm auszugeben, wird dieser
einfach Zeichen fuer Zeichen mit LD? (LDA, LDX oder LDY) in
ein Register geladen und mit ST? an die entsprechende
Bildschirmposition gebracht. Außerdem muß die korrespon-
dierende Speicherzelle des Farbspeichers mit einem Farbwert
versehen werden (s. auch Kapitel "Bildschirmspeicher" und
"Farbspeicher").
Weitere wichtige Assembler-Befehle in Bezug auf die Prozes-
sorregister sind Anweisungen zum Erhoehen und Erniedrigen
der Register:
Assembler Funktion BASIC-Entsprechung
INX erhoeht X-Reg. um eins X=X+]1
DEX erniedrigt X-Reg. um eins X=X-]
INY erhoeht Y-Reg. um eins Y=Y+]l
DEY srniedrigt Y-Reg. um eins Y=Y-]l
Diese Anweisungen benoetigen kein Argument. Ein entsprechen-
der Befehl zum Inkrementieren oder Dekrementieren des Akku-
mulators existiert nicht. Hingegen gibt es die Moeglichkeit,
einzelne Speicherzellen direkt um eins zu erhoehen oder zu
erniedrigen.
Assembler BASIC-Entsprechung
INC adresse POKE adresse, PEEK(adresse) + 1
. DEC adresse POKE adresse, PEEK(adresse) - 1]
Ein Beispielprogramm soll Ihnen die Moeglichkeiten der In-
krement/Dekrement-Anweisungen verdeutlichen (Commodore 64):
Assembler Funktion BASIC-Entsprechung
830 LDX #0 ;Schleifenzaehler 830X=0
832 LDA #42 ;sZeichencode "*" 832 A = 42
834 STA 1024,X ;Bildschirmspeicher 834 POKE 1024+X,A
837 LDA #3 ;Farbzahl 837 A=3
839 STA 55296,X ;Farbspeicher 839 POKE 55296+X,A
842 INX ;X-Reg. von O0 bis 8422 X=X +1
843 CPX #50 ;50 zaehlen und
845 BNE 832 ;Sprung zu 832 845 IFX 5O0THENB32
847 RTS ;Programmende 847 END
Anpassung fuer VIC 20: bis 8K: 7680 statt 1024, 38400 statt
55296; ueber 8K: 4096 statt 1024, 37888 statt 55296. Geben
Sie das Programm ein und starten Sie es mit SYS 830. Es
sollten 50 farbige Sternchen zu sehen sein.
28
Experimentieren Sie selbstaendig: Ersetzen Sie einmal die 42
durch andere Werte von OD bis 255, die 3 durch andere Werte
von O0 bis 7 (VIC 20) bzw. von O bis 15 (Commodore 64), die
50 durch andere Werte von OD bis 255.
Zur Erklaerung: Mit Hilfe des X-Registers wird eine Schleife
programmiert, die von DO bis 50 zaehlt. INX bewirkt jeweils
die Erhoehung um eins. "CPX" steht dabei fuer "compare x-
register", "vergleiche X-Register", in diesem fall mit 50.
Darauf folgt die BNE-Anweisung. "BNE" bedeutet "branch on
not equal", "verzweige bei Ungleichheit". Mit anderen Wor-:
ten: Solange das X-Register noch nicht gleich 50 ist, wird
zu Adresse 832 zurueckgesprungen. CPX und BNE hintereinander
entsprechen in BASIC einer IF-THEN-Anweisung (bedingte
Sprunganweisung mit logischem Vergleich).
Insgesamt existieren in Assembler drei Vergleichsbefehle:
Assembler Funktion
CMP #wert vergleicht Akkumulator mit dem Wert
CPX #wert vergleicht X-Register mit dem Wert
CPY #wert vergleicht Y-Register mit dem Wert
Entsprechungen in BASIC gibt es nicht. Auf jede Vergleichs-
anweisung folgt ein sog. "Branch-Befehl", in unserem Bei-
spiel ist das "BNE". Das ist ungefaehr so, wie in BASIC auf
IF in jedem Fall THEN folgen muß.
Damit existieren in Assembler die folgenden Moeglichkeiten
bedingter Sprunganweisungen:
Sprung bei Gleichheit: CMP #wert
BEQ adresse
Sprung bei Ungleichheit: CMP #wert
BNE adresse
Sprung bei 'kleiner als': CMP #wert
BCC adresse
Sprung bei 'groesser/gleich': CMP #$wert
BCS adresse
Wir moechten allerdings an dieser Stelle ausdruecklich
darauf hinweisen, dass die Erklaerungen im Rahmen dieser
"Einfuehrung in die Assembler-Programmierung" stark verein-
facht und keineswegs vollstaendig sind. Ein umfassender
systematischer Assembler-Kurs wuerde den Rahmen dieses
Buches sprengen. Allen wirklich Interessierten empfehlen wir
unseren "6502-Assembler-Kurs fuer Beginner", ISBN 3-88986-
000-1. Schließlich ist ein Systemhandbuch weder ein BASIC-
noch ein Assembler-Lehrbuch.
Soll ein Sprung unabhaengig von irgendwelchen Bedingungen
erfolgen, so wird dies in Assembler mit dem Befehlen JMP
(normaler Sprung) oder JSR (Unterprogrammsprung) erreicht.
"JMP" steht fuer "jump", "Sprung", "JSR" bedeutet "jump to
subroutine", "Sprung zu Unterprogramm".
Assembler Funktion BASIC-Entsprechung
JMP adresse Sprung GOTO zeilennummer
JSR adresse Unterprogrammsprung GOSUB zeilennummer
29
Die Rueckkehr aus einem Unterprogramm erfolgt mittels RTS,
"return from subroutine".
Assembler Funktion BASIC-Entsprechung
RTS Ruecksprung aus RETURN
Unterprogramm
Es wird Ihnen auffallen, daß dies derselbe Befehl ist, mit
dem jedes Assembler-Programm enden muß. Der Grund dafuer ist
recht einfach: Von BASIC aus wird jedes Assembler-Programm
als Unterprogramm aufgerufen (SYS, USR), folglich muß es
auch wie ein Unterprogramm abgeschlossen werden.
Wie Sie bereits wissen, gibt es drei Arbeitsregister in der
CPU 6502/6510: Akkumulator sowie X- und Y-Register. Der
Transfer von Daten zwischen diesen Registern erfolgt mit den
folgenden Anweisungen:
Assembler Funktion: BASIC-Entsprechung
transferiert...
TAX Akku nach X-Register x = A
TAY Akku nach Y-Register vV=A
TXA X-Register nach Akku A=X
TYA Y-Register nach Akku A=Y
Beispiel: Im Rahmen eines groesseren Programmes sollen Akku-
mulator sowie X- und Y-Register mit dem Wert der Speicher-
zelle 900 geladen werden (Adressen/Zeilennummern wurden weg-
gelassen):
Assembler BASIC
LDA 900 A = PEEK(900)
TAX X=A
TAY Y=A
Beachten Sie, daß diesmal LDA ohne Doppelkreuz verwendet
wird, da hier nicht der Wert 900 gemeint ist, sondern die
Speicherzelle mit der Adresse 900.
Zwei weitere wichtige Befehle zum Addieren und Subtrahieren
in Assembler sollten Sie noch kennenlernen. Die Befehlswor-
te lauten "ADC", "add with carry", "Addiere mit Uebertrag"
und "SBC", "subtract with carry", "Subtrahiere mit Ueber-
trag". Wichtig in diesem Zusammenhang ist das sog. "Carry-
Bit" oder "Carry-Flag" zur Bestimmung des Uebertrages (Zum
Begriff "Flag" s. auch Kapitel "Binaerarithmetik"). Der Vor-
gang ist im Grunde recht einfach: Der Mikroprozessor 6502/
6510 kann - wie Sie wissen - nur Zahlen von O bis 255 verar-
beiten. Daher muß vor jeder Addition das Carry-Bit ge-
loescht (= 0) werden. Dann werden die beiden Zahlen addiert
und ist das Ergebnis groesser als 255, so wird das Carry-Bit
gesetzt (= 1), andernfalls bleibt es geloescht.
828 LDA #24 ;laedt Akku mit dem Wert 24
830 CLC sloescht Carry-Bit (CLC, "clear carry")
831 ADC #68 saddiert den Wert 68 zu dem Wert 24
833 STA 850 ;speichert Ergebnis (92) nach Adresse 850
836 RTS ;Programmende
Das Ergebnis der Addition kann von BASIC aus mit ?PEEK(850)
abgefragt werden; gestartet wird das Programm mit SYS 828.
30
Die Subtraktion wird in Assembler aehnlich programmiert, nur
darf dabei das Carry-Bit vorher nicht geloescht, sondern
muss im Gegenteil gesetzt werden:
828 LDA #128 ;laedt Akku mit dem Wert 128
830 SEC ;ssetzt Carry-Bit (SEC, "set carry")
831 SBC #6 ;ssubtrahiert den Wert 6 von 128
833 STA 850 ;speichert Ergebnis(122) nach Adresse 850
836 RTS ;Programmende
Ist das Ergebnis der Subtraktion im "normalen" Bereich von OD
bis 255, so bleibt das Carry-Bit unveraendert gesetzt,
andernfalls wird es geloescht.
Mit BCC und BCS laeßt sich der Zustand des Carry-Bits fest-
stellen. "BCC" bedeutet "branch on carry clear", "Sprung bei
geloeschtem Carry-Bit", "BCS" hingegen "branch on carry
set", "Sprung bei gesetztem Carry-Bit". Sie kennen die An-
weisungen BCEC und BCS bereits aus dem Zusammenhang "Bedingte
Sprunganweisungen".
828 LDA #128 ;laedt Akku mit dem Wert 128
830 CLC ;ssetzt Carry-Bit (SEC, "set carry")
831 ADC #200 saddiert den Wert 200 zu dem Wert 128
833 BCS 838 ;Sprung nach 838, wenn Carry-Bit gesetzt
835 STA 850 ;speichert Ergebnis nach Adresse 850
838 RTS ;Programmende
In diesem Beispiel wird das Ergebnis nur dann in Speicher-
zelle 850 abgespeichert, wenn es im zulaessigen Bereich von
0 bis 255 liegt. Andernfalls wird durch die Addition mit ADC
das Carry-Bit gesetzt (Ueberlauf) und die danach folgende
BCS-Anweisung verzweigt den Programmablauf zu Adresse 838,
die STA-Anweisung bei 835 wird also uwebersprungen. Der Wert
in Speicherzelle 850 bleibt in diesem Fall unveraendert. Mit
den Beispielwerten 128 und 200 wird dies natuerlich immer
der Fall sein - schliesslich ist 328 ja groesser als 255.
Probieren Sie einmal andere Werte aus.
Außer dem Carry-Bit oder Carry-Flag - auch "C-Flag" - gibt
es noch sechs andere sog. "Statusbits" oder "Statusflags".
Alle sieben Statusbits sind im Prozessor zusammengefasst im
"Prozessor-Statusregister". Das achte Bit dieses Registers
wird nicht genutzt. Im einzelnen heissen die Status-Bits:
negativ result (negatives Ergebnis)
overflow (Vorzeichen-Ueberlauf)
break command (Break-Befehl)
decimal mode (Dezimalbetrieb)
interrupt disable (Interrupt sperren)
zero result (Null-Ergebnis)
Carry
DNTODOD<Z
Es wuerde den Rahmen dieses Einfuehrungskurses sprengen,
wollten wir alle Flags erklaeren. Die zwei am haeufigsten
anzutreffenden sind N- und Z-Flag.
Das Z-Flag wird immer dann vom Prozessor selbst gesetzt,
wenn das Ergebnis des direkt vorausgegangenen Befehls Null
ist. Andernfalls wird das Z-Flag geloescht. Ausschnitt aus
einem groesseren Programm:
;laedt Akku mit dem Inhalt von Speicher-
900 LDA 1024 ‚zelle (Adresse) 1024
903 BEQ 920 ;Sprung zu 920, wenn Akkuinhalt gleich 0
31
BEQ fragt das Z-Flag ab und bewirkt einen Sprung zu der
angegebenen Adresse (920), wenn es gesetzt ist. Das wiederum
haengt davon ab, ob das Ergebnis der LDA-Operation Null ist
oder nicht. BNE ist das Gegenstueck zu BEQ; bei BNE erfolgt
der Sprung dann, wenn das Z-Flag geloescht ist. Sie haben
BEQ und BNE bereits im Zusammenhang mit Vergleichsanwei-
sungen kennengelernt.
Hier die Befehle zur Abfrage des Prozessor-Statusregisters:
BCC - Sprung bei geloschtem Carry-Flag
BCS - Sprung bei gesetztem Carry-Flag
BEQ - Sprung bei gesetztem Z-Flag
BNE - Sprung bei geloeschtem Z-Flag
BMI - Sprung bei gesetztem N-Flag
BPL - Sprung bei geloeschtem N-Flag
BVC - Sprung bei geloeschtem V-Flag
BVS - Sprung bei gesetztem V-Flag
Zum Abschluß wollen wir uns jetzt noch ansehen, wie eigent-
lich Assembler-Programme im Speicher abgelegt werden. Das
ist naemlich fuer das Grundverstaendnis der Programmierung
in Assembler recht wichtig.
Der Mikroprozessor ist prinzipiell nur in der Lage, Zahlen
zu verarbeiten. Er muß sowohl Daten als auch Steueranwei-
sungen als Zahlen erhalten. Deswegen wird jedes Assembler-
Programm als eine Folge von Zahlen abgespeichert. Wenn Sie
Assembler-Text wie "LDA, "STX" etc. eingeben, so sorgt das
betreffende Assembler-System dafuer, dass dieser Text bei
Druecken der RETURN-Taste sofort in eine entsprechende
Zahlenfolge zerlegt und abgespeichert wird. Daher ist zur
Assembler-Programmierung immer auch ein Assembler-System
notwendig - egal, ob Sie nun das in diesem Buch abgedruckte
einfache System oder ein so komplexes Assembler-System wie
'T.EX.AS.' - "Terminal Extended Assembler" - benutzen.
Assemblertext Zahlencode
828 LDA #65 169 65
830 STA 1024 141 0 4
833 LDA #3 169 3
835 STA 55296 141 0 216
838 RTS 96
Das Programm steht wie folgt im Speicher:
Adresse Inhalt (dezimal) Bedeutung
828 169 LDA #
829 65 Argument zu LDA #
830 141 STA
831 0 l. Teilargument zu STA
832 4 2. Teilargument zu STA
833 169 LDA #
834 3 Argument zu LDA #
835 141 STA
836 0 l. Teilargument zu STA
837 216 2. Teilargument zu STA
838 96 RTS
Die Zerlegung einer Zahl in zwei Teilzahlen - genannt LSB
(1. Teilzahl) und MSB (2. Teilzahl) - erfolgt so:
Gesamtzahl = LSB + 256 x MSB
32
Beispiel: 1048 geteilt durch 256 ergibt 4,09375. 4 mal 256
ist gleich 1024. 1048 minus 1024 ergibt 24. Also ist das MSB
gleich 4 und das LSB gleich 24. Denn:
1024 — 24 + 256 x 4
Die Zerlegung einer Zahl in zwei Teilzahlen ist notwendig,
da eine Speicherzelle nur Zahlen von 0 bis 255 aufnehmen
kann. Groessere Zahlen werden in zwei aufeinanderfolgenden
Speicherzellen eben in zwei Teilzahlen als LSB und MSB dar-
gestellt. "LSB" bedeutet "least significant byte", "nieder-
wertiges Byte", "MSB" steht fuer "most significant byte",
"hoeherwertiges Byte" (s. auch Kapitel "Binaerarithmetik").
Die Zuordnung der Assembler-Befehlsworte zu Zahlen ist stan-
dardmaessig festgelegt (STA ist gleich 141 usw.). Neben dem
Befehlswort spielt dabei auch die "Adressierungsart" eine
Rolle. Sie haben bereits folgende Adressierungsarten kennen-
gelernt:
unmittelbar LDA #wert
absolut LDA adresse
STA adresse
LDX adresse
STX adresse
LDY adresse
STY adresse
JMP adresse
USW.
implizit INX
DEX
INY
DEY
RTS
USW.
indiziert STA adresse,X
STA adresse,Y
USW.
Insgesamt gibt es in Assembler 13 verschiedene Adressie-
rungsarten. Die Zuordnung aller Assembler-Befehlsworte in
den moeglichen Adressierungsarten zu den entsprechenden Zah-
lencodes finden Sie in diesem Buch in der Tabelle "Adressie-
rungsarten".
Damit sind wir am Ende dieses "Assembler-Schnellkurses" an-
gelangt. Sie sind - falls Sie nicht noch andere Literatur zu
Rate gezogen haben - jetzt weder in der Lage ein komplexeres
Assembler-Programm zu lesen noch gar eines zu schreiben.
Aber Sie verstehen genug von Assembler, um erstens zu
wissen, worum es dabei geht und zweitens sich entscheiden zu
koennen, ob Sie sich naeher damit befassen moechten. In
diesem Fall moechten wir Ihnen als ausfuehrliches und leicht
verstaendliches Lehrbuch nochmals den "6502-Assemblerkurs
fuer Beginner", ISBN 3-88986-000-1, empfehlen. Das Buch
nimmt speziell Bezug auch auf die Computer Commodore 64 und
vVIC 20. Zur fortgeschrittenen Programmierung in Assembler
offerieren wir Ihnen unser "'T.EX.AS.' - Assembler Entwick-
lungs- und Lehrsystem". Wir wuerden uns jedenfalls freuen,
Sie in dem einen oder anderen Werk wieder begruessen zu
koennen. INTERFACE AGE VERLAG GMBH, Vohburgerstr. 1, D-8000
Muenchen 21, Tel. (089) 5 80 67 02.
33
ASSEMBLER UND DISASSEMBLER FUER COMMODORE 64 UND VIC-20
Um das Erstellen eigener Maschinenprogramme zu vereinfachen,
ist im folgenden ein einfacher, zum groessten Teil in BASIC
geschriebener Assembler, abgedruckt. Mit diesem ist es moeg-
lich, Maschinenprogramme, Bytes und Adressen einzugeben, wo-
bei der Assembler alle notwendigen Umwandlungen selbst vor-
nimmt. Auch koennen beliebige Speicherbereiche disassem-
bliert werden. Hierzu die genaue Anleitung zur Handhabung
dieses Assemblers:
Beim Eintippen des Assemblers muss ganz besonders auf die
korrekte Eingabe der DATA-Zeilen geachtet werden. Daher wird
empfohlen, den gesamten Text nach der Eingabe noch einmal zu
kontrollieren. Auch sollte man den Assembler vor dem ersten
Start durch "RUN" erst einmal auf Cassette oder Disc abspei-
chern, um sich ein zweites. Eintippen im Falle eines "Abstur-
zes" zu ersparen.
Ist der Assembler durch "RUN" gestartet worden, so muss sich
nach einigen Sekunden der Computer mit einem blinkenden Cur-
sor melden. Nun ist der Assembler eingabebereit und erwartet
Ihre Anweisungen.
Jede Eingabezeile MUSS mit einer Adresse im Bereich von 0
bis 65535 beginnen. Bei folgender Eingabe eines Maschinenbe-
fehls ist dies die Adresse, ab der der Befehl (gegebenen-
falls mit Argument) abgelegt werden soll. So zum Beispiel
bei Eingabe des folgenden Beispielprogramms fuer den 64er:
828 LDX #0
830 LDA 646
833 STA 55296,X
836 TXA
837 STA 1024,X
840 INX
841 BNE 830
843 RTS
Wie Sie sicher bemerken, wird automatisch die naechste
Adresse nach dem eingegebenen Befehl vorgegeben, aehnlich
einem Autonumber fuer BASIC. Auch muss bei Verzweigungsbe-
fehlen nicht der Offset angegeben werden, sondern die Abso-
lutadresse.
Entsprechend erfolgt die Eingabe von Bytes und Adressen. Auf
die Adresse folgt das Byte beziehungsweise die Adresse, die
an der angegebenen Adresse abgelegt werden soll. So ent-
spricht ...
650 128 .
dem Befehl "POKE 650, 128". Fuer die Eingabe von Adres-
sen existiert kein gleichvertiger Befehl im Commodore-BASIC,
lediglich EXBASIC besitzt den Befehl "DOKE". So koennte von
EXBASIC aus statt ...
785 828
... auch geschrieben werden "DOKE 785, 828" oder in diesem
Fall "DEF USR = 828". Soll ein Wert im Bereich von O bis 255
als Pointer abgelegt werden, so muss vor den Wert der Klam-
meraffe "®" gesetzt werden, um dem Computer zu zeigen, dass
es sich um einen 16-Bit-Wert handelt.
34
Fuer die Ausgabe von Speicherinhalten stehen. drei Befehle
zur Auswahl: "D" fuer Daten in Form von Bytes, "A" fuer
Adressen und "L" fuer Assemblertext. Die Syntax fuer alle
diese Befehle ist gleich:
Startadresse Befehl (Endadresse)
Um den Speicherbereich von 41866 bis 41900 zu disassemblie-
ren, muss eingegeben werden ...
41866 L 41900
Leerzeichen koennen, ausser bei der Eingabe von Bytes und
Adressen (zur Trennung der Zahlen) entfallen.
Das Verlassen des Assembler erfolgt durch das Kommando "X",
wobei auch hier eine Zahl vor dem Buchstaben stehen muss
(die allerdings keine Bedeutung hat).
Hinweise fuer VIC-20
Fuer den VIC-20 wird mindestens eine Erweiterung um 3 KB be-
noetigt, um mit dem Assembler arbeiten zu koennen. Da jedoch
beim VIC-20 kein freier Bereich fuer das Maschinenprogramm
zur Verfuegung steht, muss der Anfang des BASIC-Bereichs
verlegt werden. Dies muss VOR der Eingabe des Listings sowie
VOR dem Einladen geschehen.
VICs mit INSGESAMT 8 KB, also mit 3-KB-Erweiterung:
Verlagerung des BASIC-Anfangs:
POKE 44, 5 : POKE 1280, O
Programmaenderungen (Position im Listing unterstrichen):
110 FORI=1025101240:... 120 SYS1117:...
470 DATA...11,4... 490 DATA...11,4...
Aufhebung der Verlagerung:
POKE 44, 4 : NEW
VICs mit MEHR ALS 8 KB, also mit B oder 16-KB-Erweiterung:
Verlagerung des BASIC-Anfangs:
POKE 44, 19 : POKE 4608, O
Programmaenderungen (Position im Listing unterstrichen):
110 FORI=4609T04824:... 120 SYS4701:...
470 DATA...11,18... 490 DATA...11,18...
Aufhebung der Verlagerung:
POKE 44, 18 : NEW
Die Aufhebung der Verlagerung ist notwendig, wenn andere
Programme geladen werden sollen oder BASIC programmiert ver-
den soll.
Ausserdem muss bei allen VICs vor den Befehl "SPpC(20)" in
Zeile 370 der Leerstring ("") gesetzt werden.
35
RSS5EIMBLER FUER COmrMmMODORE &4
198
ı11a
120
13a
140
150
169
ıra
1808
120
zu
21a
220
230
2408
238
260
era
23a
29a
384
3ıa
320
338
340
358
360
ara
3838
330
a0
418
420
438
440
+50
460
470
4230
430
Sag
s1a
s2a
538
4
ssa
Sssa
Sva
384
Ss98
sad
si
820
830
40
850
sea
AF="":B$="":1=. :J=. ıfl=. ıP=. 10=. :B=. ıh=. :DEFFNDGT5=PEERSITY+2SSHPEEKCI+1>
FORI=-S3932T053247 :RERODIA :POKEI .R=NEXT: DIMB$«25S> :FORI=. TO131 :READB$CI> :HEX
SYSS3124 1A$=A$+"" :IFA$=""GOTO12A
R=FND« 2537 :P=FNOD<2515 :1I=. :IFLEN{A$IF2ZGOTOSBE
B=RASCER$> : IFB=91 THENPOKER..P :P=A:G0OTO1ra
IFB=33THENPOKER „PEEKK 2515 sPOKER+1 „FPEERN 2525 :P=A:GOTO190
IFB-S8SGOTO1SQ
GOSUBFSTA:RB=1 :Q=PEEK AD :GOSUBFSA SPRINT :ONFGOTO1Y79:GOTO230
IFB-ESGOTOZaa
GOSUBISTA :B=2 :Q=FNDE AD :GOSUBFIR SPRINT :ONFGOTO19G:GOTOZIE
IFB-FÐENON- “BIISSPGOTCO1 28 :END :GOTO1206
GOSUB37O : I=SPEEK«KA> SIFI-4#INTX 174 >=. VSTHENI=Z
A$=B$ IK. 75+. 755 :PRINTLEFTSECA$,3)" "r:B=2:1IFLENER$S=ITHENB=1:6G0TO2S0
FORI=4TOLEN“A$> :BS=MIDSEA$.I.19 :IFBS="L" THENO=PEERCR+1> SGOSUB3EA :GOTOZTFA
IF IANDS1>=18 THENPOKE 144 .„PEEKÜR+13 :0=ST+R+2 :G0OSUB3EB :GOTOZ7R
IFB$=" 3" THENG=FNOXRA+1D :B=3 :GOSUB3EU :GOTOZTA
FRINTB$;
NET
PRINT :GOSUB4AG :ONFGOTCZ210
GOSUBFSG :PRINT"TV' :sFORI=. TOS:POKES3S1+1.29 :NEKT :POKE19S,5:G0T0120
ON-<B$CT>=AFIGOTO3S1QA: 1[I=1+1 :0ON- 1IL192>GOTO309 :GOTO120
I=INT< 1733+1:B=3 : IFLEN{A$>=3STHENB=1 :GCTCOI48
IFMID$S<A$.4.19="L"ORMIDSCA$,S,.19="C" THENB=2
IFETANDS3S1>=18 THENB=2 :P=P-A-2 sQON- KPÖ - 12SORP>127>GOTO128 :POKE2S1 ,PRND2SS
POKER,.I:sIFBP1THENPOKER+1 -FPEEKX 2515 Ss IFB=3THENPOKER+2 „PEEK (2525
P=A:GOTOZ1E
PRINTMID$SCSTE$CO) ,2> : :RETURN
POKEZ11,. sOPEN3,3:PRINT#3,SPCK 205 :CLOSES:POKEZIM..
PRINTRIGHT$«" "+5TR$ER) .2>" "RSRETURN
PRINTMID$ISTRFCO) .25 >
A=R+B :A=A+58II35 HC AFEIIFT) SF=1-ABSESGNLPEEKCSSTSIORASF) 5 SRETURN
DATA24,165.7,53,252,.133,.7, 25.6 a 169,,133,251.133,232,.133.7,202.232,183.
DATRZ.201,.32,240,.248.232.201. 24a,.240,202 ‚2a. 48.144.227 ,201.5%8.175.,.224
DATA1S9. ‚2 .,265.233,48, 144.208 .2 GG 1a,176,. 203,72,.165,252, 133,5, 165,251, 10.2
DATAS,10,38,8,101.251,.133,251.165,8.101.252. 1#3.292.6.251.38, 2S52,.104,.101
DATA251,133.2531.- 144 ,2,230, 252.,232,263.205,169,.133,211.133,208,.32.207.255
DATRZa1,32,244. 249.162, 201.13,24Q,13,157,.2,134,7.3 32,207 .255.166,7.222
DATRA293.233,138.244,221. 169, .157,.2.168,17@, 32.50,207.169.251.133,.253,169
DATR2S2,133,254.176,201 ,.202,232,189,,2,240,46,201 .32,290,245,201 .689.1r6.4
DATAZa1.43,176,6,.153,,1,200,.208,232,32,579,207.1765,23,3.169,91,.4a.244,2
DATA169.93.153,,1.200,199, .2.244,6.153,.1,.232.288, 244, 152,160.2,195,.45,18
DATA,208,145,45,169,1,.2008.145.45.96
DATABRK , "ORRLL 43" „ORAL, ARSLE.,FHP.ORASE ‚AS, .ORRI,.RS nd: BPII."ORREL> „'r
DATA, "ORAL .#" „"ASLE.8",CLC, "ORAI.Y"., ."ORAI, K"U,"'ASLI,.R",„T5SRT."RANDET.%>
DATA,BITE,ANDE ROLL .PLP,RAND#E,ROL.BITI.ANDI.RCGLI,BMII."ANDELD.Y".-„."ANDE.
DATA"ROLL,X" „SEC, "ANDI .Y",. . „"RANDI.=" ."ROLI,82" .RTI,"EOR£EL,AD",.. „EORL.LSRI
DRATAPHA ,EOR#TL ,LSR, IMPJI.EORI,LSRI,.BYCI."EORLCD,V".,„ „"EORL,@","LSRC.®" .CLI
DATR"EOR],Y",,„"EORI.%" ,"LSRI,.#" .RTS."ADCCEL,#>",, „ADCLE,RÜÖRL,PLR,.ROCHE „ROP
DATATMPX > ,.RDCI,.RORI.BYSI. "ROCK .Y".. „"ROCL,#" ."RORL.%",SEI."RDCI.YT".,
DATA"ADCI,#" ,"RORI,8",,"STRCL,MD3" „„‚STYL,STAL.STKL,DEY, „TKA,STYI.STAI.STK]
DATRBCCI,"STACCD,Y",,"STYL,#" "STALL. #"."STAL.Y".TYA,."STRI,Y".TAS,."STAI.E
DATA,LOW#L,"LOR<C,SD" „LOX#C,LDY[.LDA[L ,LOs[,TAY,LOR#EC,TRAS,LDYJI.LDARI,LD0%8]
DATRBCSI,"LORCEI,Y" "LOVE." ."LOAL.=&","LDSC,Y" ,CLY,"LORI,Y",T2S."LDYI,&
DATA"LDAI,%","LDXJ.Y",CPY#L,"CMPSL.X5", „CPYC,CHPE,DEC[E.INY.CHPAC,DES,CPY)
DATACHPI,DECI..BNEI,"CMPCCH,Y" ,„„"CMPL.X","DEC[.R2" ,CLO,"CMPJI.Y".-„"CMPI.®
DATA"DECI.X" CPX#L."SBCEL,X>", ,CPXL,SBCLE, INCL, IN% .SBCHL,HOP.CP=3I,5BCJ. INC
DATABEQI,"SBC<CI.,.Y",.,„"SBCE.@" ,"INCC.#",SED,."SBC1.Y".,,"SBCJI.#"."INCI.®
36
ADC:
AND:
ASL:
BCC:
BCS:
BEQ:
BIT:
BMI:
BNE:
BPL:
BRK:
BVC:
BVS:
CLC:
CLD:
CLI:
CLV:
CMP:
CPX:
CPY:
DEC:
DEX:
DEY:
EOR:
INC:
INX:
INY:
JMP:
JSR:
LDA:
LDX:
LDY:
LSR:
NOP:
ORA:
PHA:
PHP:
PLA:
PLP:
ROL:
ROR:
RTI:
RTS:
SBC:
SEC:
SED:
SEI:
STA:
STX:
STY:
TAX:
TAY:
TSX:
TXA:
TXS:
TYA:
BEFEHLSLISTE
Speicher mit Carry zu Accumulator addieren
Speicher durch "AND" mit Accumulator verknuepfen
Speicher/Accumulator um ein Bit linksverschieben
Verzweigung bei geloeschtem Carry
Verzweigung bei gesetztem Carry
Verzweigung bei gesetzter Zero-Flag
Bit-Test zwischen Speicher und Accumulator
Verzweigung bei gesetzter Negative-Flag
Verzweigung bei geloeschter Zero-fFlag
Verzweigung bei geloeschter Negative-fFlag
Ausloesung eines Software-Interrupts
Verzweigung bei geloeschter Overflovw-fFlag
Verzweigung bei gesetzter Overflow-Flag
Carry loeschen
Dezimalmodus ausschalten
Interrupt freigeben
Overflow-Flag loeschen
Speicher mit Accumulator vergleichen
Speicher mit X-Register vergleichen
Speicher mit Y-Register vergleichen
Verminderung des Speicherinhalts um eins
Verminderung des X-Registers um eins
Verminderung des Y-Registers um eins
Speicher durch "EXOR" mit Accumulator verknuepfen
Erhoehung des Speicherinhalts um eins
Erhoehung des X-Registers um eins
Erhoehung des Y-Registers um eins
Sprung zu Adresse
Unterprogrammsprung zu Adresse
Accumulator mit Wert laden
X-Register mit Wert laden
Y-Register mit Wert laden
Speicher/Accumulator um ein Bit rechtsverschieben
keine Operation
Speicher durch "OR" mit Accumulator verknuepfen
Accumulator auf Stack legen
Prozessorstatus auf Stack legen
Accumulator vom Stack holen
Prozessorstatus vom Stack holen
Linksrotation um ein Bit (Speicher, Accumulator)
Rechtsrotation um ein Bit (Speicher, Accumulator)
Ruecksprung aus Interruptsequenz
Ruecksprung aus Unterprogramm
Speicher mit Carry von Accumulator subtrahieren
Carry setzen
Dezimalmodus einschalten
Interrupt sperren
Accumulator in Speicher ablegen
X-Register in Speicher ablegen
Y-Register in Speicher ablegen
Accumulator in X-Register uebertragen
Accumulator in Y-Register uebertragen
Stackpointer in X-Register uebertragen
X-Register in Accumulator uebertragen
X-Register in Stackpointer uebertragen
Y-Register in Accumulator uebertragen
ausgefuehrte Operation,
symbolische Darstellung
A+M+C>A,Cc
AAM-NA
C=- 76543210 -—0D
branch on C
branch
branch
AAM,
branch on N
branch on Z
branch on N
P
V
V
=
SQ
nonzuann
oo»
PC + 2),
branch on
branch on
ı u
OÖ
<< x ZI. < x Zz<x >o0o000
=
ey
1) > PCL
(PC 2) > PCH
PC +2),
an
in ©)
ig)
eration
A
X
Y
76543210 —C
p
MA
76543210 — C
76543210 —C
[ep]
=.
{
7
—>
P>yWı>Px<x< 52 2Z2-,D0N 2»
a Ze re
<xxwW>,><<DJ-br-r.F-r->UO DNNINTTIPI D> > I OO > =Z= 2
(PC + 1) — PCL
(PC + 2) _. PCH
38
BEFEHLSLISTE
Statusregister
NVBDIZC
* * 2 A . * %*
* 3 oe ®e U} * ®.
* ®. ® ®. ® * *
M7M6. U} ® }
® ® 1 ® 1 ® ®.
[ _} ®. . . ® 0
® ® ® 0 U} U} 0}
} [7 ® 0} 0 oe _}
} 0 ®. ®. ® ® 3
* [} ®. U} ® * *
%* ® ® “. U} * *
%* y 5 . * %*
* ®. ®. } * 3}
* e } . ® * 0}
* ®. ®. ® * .
* ®. ® } * 0}
* ® ®. . *
* L} . 0} 7 * _}
* “ ® ® ® *
* ® EZ “ 2 * U}
* . “. . *
* ®. ® } * ®
0 ® 1 o 0} * *
* ®. ®. [7 . * ®
* ®. . ® } *
vom Stack
* ® . . . * *
* ® ® “ ® * *
vom Stack
* %* ” Pr * %*
®. ®. . ®. } l
“ ®. . 1 . ®. ®
. ® ®. 1
* = . *
* ®. ® ®e *
* 2 n %+
* ® * ®.
%* A *
Zeichen-
erklaerungen
Accumulator
X-Register
Y-Register
Memory,
Argument
P Prozessor-
status-
register
5S Stack-
pointer
PC Program-
counter,
Programnm-
zaehler
PC low
PC high
0O Bitwert DO
l Bitvert 1
— Transfer
nach
= Transfer
nach
} Ablegen auf
Stack
f Holen vom
Stack
Addition
Subtraktion
logisches
UND
logisches
ODER
logisches
EXKLUSIV-
ODER,
Antivalenz
* beeinflusst
keine
Aenderung
gleich
Negativflag
Overflov,
Vorzeichen-
ueberlauf
B Flag fuer
Software-
IRQ (BRK)
D Flag fuer
Dezimal-
modus
I Interrupt-
disablebit
Z Zeroflag,
Nullflag
C Carry,
Uebertrag
B Borrow,_
l-c,c€
2<x<>
4 < >ı+
<< zZ ı
acc
umu
lat
or
10
74
106
imm
edi
ate
105
4l
201
224
192
73
233
36
102
229
133
134
132
ADRESSIERUNGSARTEN
zer zer abs abs
opa opa olu
ge,
x
117
53
22
213
‚214
85
246
181
180
86
21
>4
118
245
149
148
ge,
y
182
150
te
109
45
14
44
205
236
204
206
77
238
76
32
173
174
172
78
13
46
110
237
141
142
140
olu
te,
221
222
93
254
189
188
94
29
62
126
253
157
39
abs imp rel
olu lie ati
te,
y
121
57
217
89
185
190
25
249
153
d
232
200
248
120
170
168
186
138
154
152
ve
144
176
240
48
208
16
80
112
(in
dir
ect
„x)
97
33
65
161
225
129
(in
(in
dir dir
ect ect
),y
113
49
209
81
177
17
241
145
)
108
DER VIDEO INTERFACE CHIP
Saemtliche Graphikmoeglichkeiten des Commodore 64, sei es
nun die hochaufloesende Graphik, seien es die Sprites oder
die "gewoehnliche" Darstellung von 40 Spalten mal 25 Zeilen,
lassen sich auf den 6567 Video Interface Chip (auch VIC-II-
Chip genannt) zurueckfuehren. Dieser sehr intelligente Bau-
stein ermoeglicht, es beim Commodore 64 graphische Effekte
in Programme einzubauen, die auf anderen Computern eines
sehr grossen Programmieraufwandes beduerfen oder schlichtweg
unmoeglich sind. Im folgenden soll nun auf die einzelnen Ei-
genschaften des VIC-II-Chips eingegangen werden, so dass es
Ihnen moeglich sein wird, seine Moeglichkeiten vollstaendig
auszuschoepfen, was jedoch gar nicht so einfach ist.
Zunaechst einen allgemeinen Hinveis auf die Struktur des
VIC-II-Chips, die bei saemtlichen Anwendungen beruecksich-
tigt werden muss. Die 6567 kann, von dem vom Computer adres-
sierbaren Bereich von 64 KB, jeweils nur 16 KB nutzen. Im
Normalfall ist dies der Bereich von Adresse O bis 16383, der
beim Einschalten des Computers als fuer den VIC-II-Chips
sichtbar deklariert wird. Dieser Bereich von "nur" 16 KB re-
sultiert aus der Anzahl an Adressleitungen, von denen der
VIC-II-Chip nur 14 (anstelle der 16 Adressleitungen des Pro-
zessors) hat. Soll nun ein anderer Bereich spezifiziert ver-
den (dies kann immer nur in L16-KB-Bloecken geschehen), so
muss dies in den Bits O und 1 des Ports A (Adresse 56576)
der NMI-CIA (CIA #2) festgelegt werden.
Es stehen folgende Moeglichkeiten fuer den Adressbereich des
VIC-II-Chips zur Verfuegung (das Datenrichtungsregister muss
natuerlich auf Ausgang geschaltet sein):
Adressbereich Bitmuster dezimal
0 - 16383 11 3 Normalvwert
16384 - 32767 10 2
32768 - 49151 01 1
49152 - 65535 00 0
Um nun auf einen anderen Bereich umzuschalten, muessen Bit 0
und Bit 1 des Port A auf den unter "dezimal" stehenden Wert
gesetzt werden. Dies koennte folgendermassen vor sich gehen:
POKE 56576, PEEK (56576) AND 252 OR dezimal
Dieses 16-KB-Konzept ist Teil aller Speicherzugriffe des
VIC-II-Chips und sollte daher unbedingt beachtet werden. Ist
zum Beispiel der Bereich von 32768 bis 49151 gewaehlt, so
liegt der Bildschirmspeicher (sofern nicht geaendert) ab der
Adresse 32768 (Video-Bank-Startadresse) plus 1024 (normale
Startadresse des Bildschirmspeichers) = 33792. Aber auch die
Daten der Sprites und der hochaufloesenden Graphik unterlie-
gen diesem Konzept.
Ein weiterer Hinweis bezueglich des Video-Chips: Er umfasst
47 Register, durch die dessen Funktionen gesteuert werden.
Diese Register liegen im Bereich von 53248 bis 53294 und
koennen mittels POKE und PEEK bearbeitet werden. Eine Ueber-
sicht bezueglich des Video-Chips ist dem Anhang zu entneh-
men.
Der Bildschirmspeicher
Der Bereich, in dem die Daten fuer die normale Darstellung
von 40 mal 25 Zeichen liegen, wird Bildschirmspeicher ge-
41
nannt. Dies ist ein Bereich von 10008 Bytes mit einer Breite
von 8 Bits. Jede Speicherzelle kann daher Werte aus dem Be-
reich von O bis 255 annehmen. Diese Werte geben im "Standard
Character Mode" das Zeichen an, das an der entsprechenden
Stelle des Bildschirms erscheinen soll. In anderen Darstel-
lungsmodi kann dieser Bereich auch die Farbcodes fuer ein
Feld von 8 mal 8 Dots enthalten. Darauf wird dann aber ge-
sondert eingegangen. Der Bildschirmspeicher kann in |]-KB-
Bloecken verschoben werden. Bei einem fuer den VIC-II-Chip
adressierbaren Bereich von 16 KB ergeben sich daher 16 Moeg-
lichkeiten fuer die Lage des Bildschirmspeichers. Bits 4 bis
7 von Register 24 (Adresse 53272) geben diese- Startadresse
an. Folgende Tabelle zeigt die moeglichen Bereiche fuer den
Bildschirmspeicher:
Adressbereich Bitmuster dezimal
D - 999 0000 0
1024 - 2023 0001 l Normalvwert
2048 - 3047 0010 2
3072 - 4071 0011 3
4096 - 5095 0100 4
5120 - 6119 0101 5
6144 - 7143 0110 6
7168 - 8167 OH1 7
8192 - 9191 1000 B
9216 - 10215 1001 9
10240 - 11239 1010 10
11264 - 12263 1011 11
12288 - 13287 1100 12
13312 - 14311 1101 13
14336 - 15335 1110 14
15360 - 16359 1111 15
Auch hier duerfen nur die entsprechenden Bits geaendert ver-
den, da ein Register oft mehrere Bedeutungen hat. Der Befehl
zum Aendern des Adressbereichs des Bildschirms lautet ...
POKE 53272, PEEK (53272) AND 15 OR 16 * dezimal
Bei der Festlegung der Startadresse fuer die Videomatrix ist
zu beachten, dass hierzu, vie bei allen Adressfestlegungen
fuer den VIC-II-Chip, die Startadresse der momentanen Video-
Bank zu addieren ist, um die wirkliche Startadresse des
Bildschirmbereichs zu erhalten, ab der dann die Daten abge-
legt werden koennen.
Dieser Bereich des Bildschirmspeichers wird nun aber noch
nicht durch die Zeichenausgaberoutine des Betriebssystems
unterstuetzt, da das 05 (Operating System) nicht ueber-
prueft, ob die Startadresse des Bildschirms vom Wert 1024
abweicht. Hierzu ist es noetig, die Speicherstelle 648 zu
aendern. Diese gibt die Startpage des Bildschirmspeichers
an.
Dazu ein Beispiel: Wurde als Video-Bank der Bereich von
32768 bis 49151 spezifiziert und soll die Videomatrix ab
Adresse 35840 liegen (dies entspricht der Adresse 3072 in-
nerhalb des 16-KB-Bereichs), so muessen folgende Befehle
eingegeben werden, damit ausserdem die Zeichenausgaberoutine
des Betriebssystems die Zeichen in diesem Bereich ausgibt:
POKE 56576, PEEK (56576) AND 252 OR ]
POKE 53272, PEEK (53272) AND 15 OR 16 * 3
POKE 648, 35840 / 256
42
Hierdurch ist es zum Beispiel auch moeglich, den Bildschirm-
anfang auf die Adresse 32768 zu legen, da sich auf diese
Weise das Umschreiben von Programmen fuer die CBMs mit 40
Zeichen je Zeile wesentlich vereinfacht. Lediglich der Be-
reich fuer die Farben der einzelnen Zeichen muss hierbei
noch miteinbezogen werden.
Da der Bildschirmbereich nur 1000 Bytes umfasst, bleiben am
Ende noch 24 Bytes des 1-KB-Blocks fuer die Videomatrix ueb-
rig. Hiervon sind die ersten 16 Bytes unbenutzt, die letzten
acht Bytes stehen im Zusammenhang mit den Sprites und werden
bei der Erklaerung der Sprites ausfuehrlich erlaeutert.
Der Farbspeicher
Um jedes einzelne Zeichen des Bildschirmspeichers in einer
der 16 verschiedenen farben darzustellen, wird der Farbspei-
cher benoetigt. Dieser RAM-Bereich umfasst 1024 Adressen zu
je 4 Bits (Bit O0 bis Bit 3), wobei jede Zelle einen Wert von
0 bis 15 enthaelt, der fuer die jeweilige Farbe steht. Der
Farbspeicher hat jedoch auch noch andere Aufgaben, auf die
dann aber im entsprechenden Zusammenhang naeher eingegangen
werden wird.
Der Farbspeicher kann nicht in einen anderen Bereich verlegt
verden und liegt daher konstant an den Adressen 55296 bis
56319, wobei jedoch auch hier, wie bei der Videomatrix, nur
die ersten 1000 Nybbles (damit ist ein Block von vier Bits
gemeint) benutzt sind. Die restlichen 24 Nybbles sind unbe-
nutzt.
Der Zeichengenerator (Definition eigener Zeichen)
Im Zeichengenerator sind die Informationen gespeichert, wie
die Zeichen, die im normalen Darstellungsmodus auf dem Bild-
schirm erscheinen, aussehen. Da ein Zeichen eine Gebiet von
8 mal 8 Punkten umfasst, werden zur Definition eines Zei-
chens 64 Bits (entsprechend 8 Bytes) benoetigt. Bei einem
Zeichenvorrat von 256 Zeichen ergibt dies 256 * 8 Bytes
gleich 2 KB, die ein kompletter Zeichensatz einnimmt.
Die Lage des Zeichensatzes ist in 2-KB-Bloecken frei waehl-
bar, daraus resultieren 8 Moeglichkeiten fuer den Bereich
des Zeichengenerators. Die Bits 1] bis 3 des Registers 24
(Adresse 53272) muessen zur Festsetzung der Startadresse ge-
aendert werden. Der Zeichengenerator-ROM des Betriebssystems
liegt in den Adressen von 53248 bis 57343. Es werden 4 KB
benoetigt, da der Commodore 64 schliesslich zwei vollstaen-
dige Zeichensaetze vorsieht und bei Umschaltung von einem
zum anderen Zeichensatz nur die Startadresse geaendert wird.
Dieser 4-KB-Bereich ist im Normalfall jedoch fuer 1/O und
das Farb-RAM vorgesehen, und der Benutzer kann nicht direkt
auf die Daten des Zeichengenerators zugreifen.
Das Einblenden des Zeichengenerators und das Ausblenden der
1/0-Bausteine kann durch Loeschen von Bit 2 im Prozessorport
der CPU 6510 erfolgen. Allerdings muss zuvor der Interrupt
abgeschaltet werden (Bit 0 des Adresseninhalts von 56334
loeschen), da das Betriebssystem auf diesen Bereich zugreift
und, sofern die I/O-Register nicht erreichbar sind, den Conm-
puter abstuerzen laesst. Nach Zugriff auf den Zeichengenera-
tor sollte dieser durch Setzen von Bit 2 des Prozessorports
wieder ausgeblendet werden und das Interrupthandling durch
Setzen von Bit O des Kontrollregisters A wieder aufgenommen
werden. Um zum Beispiel den Zeichengenerator aus dem Bereich
von 53248 bis 55295 in den Bereich von 14336 bis 16383 zu
43
uebertragen kann folgendermassen vorgegangen werden:
POKE 56334, PEEK(56334) AND 254
POKE 1, PEEK(1) AND 251
FOR 1=53248 TO 55295 : POKE 1-38912, PEEK(I) : NEXT
POKE 1, PEEK(1) OR 4
POKE 56334, PEEK(56334) OR 1
Da der VIC-II-Chip jedoch immer nur auf einen 16-KB-Bereich
zugreifen kann, muss das Zeichengenerator-ROM fuer den
Video-Chip auf eine weitere Weise verfuegbar sein. Schliess-
lich liegen die Adressen von 53248 bis 57343 nicht im Be-
reich der Standard Video-Bank von O bis 16383. Daher ist der
Zeichengenerator zusaetzlich in den Bereichen von 4096 bis
8191 sowie 36864 bis 40959 sichtbar, dies jedoch nur (!)
fuer den VIC-II-Chip. RAM, das in diesem Bereich liegt, ist
daher ohne jegliche Einschraenkungen benutzbar. Auch wenn
der Zeichengenerator in den vom Prozessor lesbaren Bereich
eingeblendet wird, so bleiben die obengenannten Bereiche da-
von unberuehrt. Soll jedoch der VIC-II-Chip auf einen RAM-
Bereich zugreifen, der auch von Character-ROM "unterlegt"
ist, so wird dieser sich fuer den RODM-Bereich entscheiden.
Eigene Zeichensaetze, Bildschirmdaten, HIRES-Graphiken etc.
sollten daher in anderen Bereichen abgelegt werden.
Hier eine Uebersicht ueber die moeglichen Bereiche des Zei-
chengenerators. Zu den Bereichsadressen ist auch hier die
Bankstartadresse zu addieren:
Adressbereich Bitmuster dezimal
0 - 2047 000 0
2048 - 4095 001 l
4096 - 6143 010 2 Normalvwert
6144 - 8191 011 3
8192 - 10239 100 4
10240 - 12287 101 5
12288 - 14335 110 6
14336 - 16383 ıll 7
In Video-Bank DO und 2 sind die Bereiche 4096 bis 8191 von
der Kopie des Zeichengenerators belegt. Zum Aendern der
Startadresse des Zeichengenerators dient der folgende Be-
fehl:
POKE 53272, PEEK (53272) AND 241 OR 2 * dezimal
Um nun ein eigenes Zeichen zu definieren muss folgenderma-
ssen vorgegangen werden: Der Bildschirmcode des zu definie-
renden Zeichens wird mit 8 multipliziert (jedes Zeichen be-
noetigt zur Darstellung 8 Bytes) und zur Startadresse des
Zeichengenerators addiert. Diese Adresse gibt nun die Start-
adresse fuer die Daten dieses speziellen Zeichens an.
Angenommen, folgendes Summenzeichen solle definiert werden:
Zeichen Binaer Dezimal
u oIIIIIlo 126
“a. ** olloollo 102
er oolloooo 48
*%* ooollooo 24
*%* oolloooo 48
“ar *%* olloolIo 102
KraRRH olIIIIIo 126
00000000 0
Hierzu gleich ein Hinweis: Es sollten immer mindestens zwei
gesetzte Punkte nebeneinander liegen, da es ansonsten zu
farblichen Veraenderungen in der Darstellung kommen kann.
Ein gesetztes Bit entspricht nun einem Punkt in der Farbe,
die im zugehoerigen Nybble des Farb-RAMs spezifiziert wurde.
Geloeschte Bits werden als Dots in der momentanen Hinter-
grundfarbe dargestellt.
Um nun dieses Zeichen in den Zeichensatz, den wir zuvor in
den Bereich von 14336 bis 16383 uebertragen haben, einzubin-
den, muessen die unter der Spalte 'Dezimal' stehenden Zahlen
in die Zeichengeneratortabelle uebertragen werden. Vergessen
Sie nicht, den Bereich ab 14336 vor Zugriff durch BASIC mit-
tels den Befehlen
POKE 55, O0 : POKE 56, 56 : CLR
... zu schuetzen, da sonst der Zeichengenerator ueberschrie-
ben werden kann (die Befehlsfolge sollte in der ersten Zeile
des Programms stehen). Soll das Sigma-Zeichen nun dem Bild-
schirmcode 28 (im Normalfall das Pfund-Zeichen) zugeordnet
werden, so muessen die Daten fuer das neue Zeichen ab der
Position 14336 (Startadresse des Zeichengenerators) plus 8 *
28 (Zeichencode) abgelegt werden. Dies kann zum Beispiel er-
folgen durch ...
FOR 1=14560 TO 14567 : READ A : POKE I, A : NEXT
DATA 126, 102, 48, 24, 48, 102, 126, O
Auch der Code Null ist in diesem Fall wichtig, da schliess-
lich alle 8 Zeilen des Zeichens neu belegt werden muessen.
Nun muss der Zeichensatz mit dem neuen Zeichen noch akti-
viert werden. Dies erfolgt durch den Befehl zur Festsetzung
der Startadresse eines Zeichengenerators, in diesem Spezial-
fall fuer die Startadresse 14336 durch
POKE 53272, PEEK (53272) AND 241 OR 2 * 7
Sollten Sie die auf dieser und der vorherigen Seite aufge-
fuehrten Befehlskombinationen in der korrekten Reihenfolge
(oberen Bereich vor BASIC schuetzen, Zeichensatz kopieren,
neues Zeichen in Zeichensatz uebertragen, neuen Zeichengene-
rator aktivieren) eingegeben haben, so sollte jetzt jedes-
mal, wenn Sie die Pfund-Taste druecken, das Summenzeichen
erscheinen.
Hierzu noch Anmerkungen: Wird nun mittels der Commodore-Ta-
ste oder ueber CHR$ in einen anderen Zeichensatz umgeschal-
tet, so wird der Bildschirm keinerlei Zeichen mehr enthalten
(meist wohl irgendwelche Punkte und Linien), da durch obige
Befehlsfolgen nur ein Zeichensatz definiert wurde. Es ist
jedoch moeglich, einen zweiten Zeichensatz zu definieren,
der dann auch (wie der zweite interne Zeichensatz) direkt
angesprochen werden kann. Hierbei muessen jedoch beide Zei-
chensaetze innerhalb eines 4-KB-Blocks liegen.
Ein weiterer Punkt: Auch wenn nun das Zeichen definiert wur-
de, so ist das Pfund-Zeichen noch immer als negatives Zei-
chen vorhanden. Dies ist erkennbar, wenn man zum Beispiel
den Cursor auf ein Sigma-Zeichen bewegt. Negative Zeichen
muessen daher, sofern erwuenscht, getrennt definiert werden.
Soll das bereits als positives Zeichen vorhandene Sigma auch
als negatives Zeichen mit dem Code 156 (128 plus 28)
erreichbar sein, so kann die Definition durch
45
FOR I = 14336 + 156 * 8 TO 14336 + 156 * 8 + 7
READ A : POKE I, 255 - A : NEXT
... erfolgen (vergessen Sie den RESTORE-Befehl nicht, falls
Sie die gleichen Daten ein weiteres Mal verwenden). Bei ne-
gativen Zeichen werden gesetzte Bits durch geloeschte Bits
ersetzt und umgekehrt.
Durch die Zeichendefinition ist es moeglich, den gesamten
Zeichensatz umzudefinieren. Allerdings bevirkt ein veraen-
dertes Aussehen an den Zeichen nichts. Sie haben noch immer
die gleichen Funktionen, die sie auch vorher hatten, auch
venn sie in BASIC-Listings vielleicht ein wenig seltsam aus-
sehen moegen.
Hier noch einmal kurz die Vorgehensweise, die 8 Bytes an Da-
ten fuer den Zeichensatz aus einem fertigen 8 mal B Punkte-
muster zu erzeugen: Jede der acht Zeilen wird getrennt bear-
beitet und in der Reihenfolge von oben nach unten in der
DATA-Zeile abgelegt. Die acht Punkte innerhalb einer Zeile
verden als Binaerzahl aufgefasst. Ein gesetzter Punkt ent-
spricht daher der Ziffer 1, ein geloeschter Punkt dem Zif-
fernvert O0. Jede Stelle innerhalb des Bytes (8 Bits) hat nun
einen bestimmten Wert. Dies sind die Potenzen von 2. Das
linke Bit hat den Wert 128 (entsprechend 2 hoch 7), das
rechte Bit den Wert 1 (entsprechend 2 hoch 0). Jeder Wert
einer Bitposition wird nun mit dem Zifferwert dieses Bits
multipliziert (das Ergebnis ist also entweder gleich null
oder gleich dem Bitwert) und alle Ergebnisse addiert. Dies
ist dann einer der acht Werte.
Modus fuer erweiterte Hintergrundfarben
Oft ist es wuenschenswert, mehr als nur eine Hintergrundfar-
be fuer ein Zeichen zür Verfuegung zu haben. Fuer solche An-
wendungen ist der Modus fuer erweiterte Hintergrundfarben
(Extended Background Color Mode) gedacht, der es ermoeg-
licht, jedem Zeichen eine der vier globalen Hintergrundfar-
ben zuzuordnen. Ausserdem ist es weiterhin moeglich, eine
der sechzehn Vordergrundfarben fuer das Zeichen auszuwaeh-
len. Das Aktivieren dieses Moedus' erfolgt durch Setzen von
Bit 6 in Register 17 (Adresse 53265) des VIC-II-Chips, wo-
durch Bit 6 und Bit 7 des in der Videomatrix stehenden Zei-
chencodes nun als Information ueber die Hintergrundfarbe des
Zeichens verarbeitet werden. Aus der Kombination von zwei
Bits ergeben sich nun folgende vier Moeglichkeiten:
Bit 7 Bit 6 Dezimalbereich Hintergrundfarbregister
0 0 0 - 63 Background Color #0 (53281)
0 1 64 - 127 Background Color #1 (53282)
l 0 128 - 191 Background Color #2 (53283)
1 l 192 - 255 Background Color #3 (53284)
Aus der Verwendung der Bits 6 und 7 als Hintergrundfarb-
pointer (schliesslich geben die beiden Bits nicht die Farbe
selbst, sondern das Background Color Register, aus dem die
Farbe stammt, an) resultiert, dass nur noch die Zeichencodes
von O0 bis 63 verwendet werden koennen. Alle Zeichen mit ei-
nem Bildschirmcode ab 64 werden wieder in den Bereich von DO
bis 63 umgewandelt und mit der zugehoerigen Hintergrundfarbe
dargestellt.
In BASIC-Programmen lassen sich die Bildschirmcodes recht
gut erreichen. Die Zeichen von 0 bis 63 (entsprechend den
CHR$-Codes von 32 bis 95) werden wie gewohnt, dass heisst in
46
/
der "normalen" Hintergrundfarbe, dargestellt. Die gleichen
Zeichen mit den Codes von 64 bis 127 (also mit der Hinter-
grundfarbe #1, die in Adresse 53282 festgelegt wird) koennen
zum groessten Teil (alle Buchstaben, die restlichen Zeichen
muessen leider gesucht werden, da nicht bei jeder Taste die
Kombination mit der Shift-Taste eine Erhoehung des Zeichen-
codes um 64 bewirkt) durch zusaetzliches Druecken der Shift-
Taste erreicht werden. Negative Zeichen wiederum werden in
den Hintergrundfarben #2 und #3 dargestellt.
Da die Farben selbst nicht dem Zeichencode direkt mitgegeben
werden (sondern nur die Information, wo die Farbe zu finden
ist), ist es zum Beispiel moeglich, saemtlichen Zeichen ei-
ner Hintergrundfarbe gleichzeitig eine neue Hintergrundfarbe
zuzuordnen, ohne dass etwas am Zeichencode geaendert werden
muss (es muss einfach nur das Register fuer die entsprechen-
de Hintergrundfarbe geaendert werden). Die Vordergrundfarbe,
also die Farbe, in der das Zeichen selbst dargestellt wird,
kann (vie im normalen Darstellungsmodus auch) ueber die
Farbtasten geandert werden und wird weiterhin im Color Memo-
ry (Farb-RAM) im Adressbereich von 55296 bis 56295 abgelegt.
Mehrfarbige Zeichen (Multicolor Modus)
Oft ist es erwuenscht, ein Zeichen innerhalb eines B mal B8
Feldes in mehreren Farben darzustellen. Hierzu eignet sich
moeglicherweise der 'Modus fuer erweiterte Hintergrundfar-
ben', der mit dem hier beschriebenen Modus NICHT kombinier-
bar ist. Eine weitere Moeglichkeit fuer eine groessere fFarb-
auswahl ist der Multicolor Modus. Dieser wird durch Setzen
von Bit 4 im Register 22 (Adresse 53270) eingeschaltet. De-
durch werden die Daten aus dem Zeichengenerator ein wenig
anders interpretiert, als dies der fall ist, wenn dieses Bit
geloescht ist.
Voraussetzung fuer die Darstellung eines Zeichens im Multi-
color Modus ist, dass Bit 3 im Color-Nybble-RAM gesetzt ist
(also eine Farbe ueber die Commodore Taste ausgewaehlt wur-
de). Ist dies nicht der Fall, so wird das Zeichen in der ge-
wohnten Weise dargestellt (allerdings stehen fuer diese 'ge-
wohnte Darstellungsveise' - durch die Benutzung von Bit 3
als Flag - nur noch die ersten acht Farben zur Verfuegung).
Eine Mischung beider Modi ist daher problemlos moeglich. Bei
gesetzem Bit 3 im Farb-RAM werden jeweils zwei Bits aus dem
Zeichengenerator fuer die Auswahl der Farbe verwendet. Da
aber auch jeweils zwei Punkte angesprochen werden, halbiert
sich die effektive Aufloesung auf eine Groesse von 4 (hori-
zontal) mal 8 (vertikal) doppelten Dots. Die Groesse des
Zeichens bleibt daher bei 8 mal 8 Punkten. Die einzelnen
Bitpaare koennen folgende Zustaende annehmen und haben daher
folgende Bedeutungen:
Bitpaar Farbquelle Funktion
00 Background #0 (5328]) Hintergrund
01 Background #1 (53282) Hintergrund
10 Background #2 (53283) Vordergrund
11 Color RAM, Bits 0-2 Vordergrund
Auch fuer die zum Bitpaar '1l]l' gehoerigen Dots stehen nur
noch die ersten acht Farben zur Verfuegung, da nur noch Bit
0 bis Bit 2 des Farb-RAM zur Verwendung freistehen. Die
Spalte 'Funktion' haengt mit der Benutzung von Sprites zu-
sammen und hat ansonsten keinerlei Bedeutung.
47
Hierzu ein Beispiel:
spiel sind identisch mit denen fuer die Definition des
ma-Zeichens,
gesetzt und die DATA-Zeile geaendert werden.
Es soll folgendes Zeichen (bestehend aus drei
plus der fuer den Hintergrund zustaendigen Farbe)
verden:
Zeichen
++ *
++ *%*
++**
++**
*Rrr+
u
v* ++
++
Die Voraussetzungen
Farbgruppen
allerdings muss zusaetzlich das Multicolor
Binaer
olIIIIIo
oloooolo
ooollooo
ooollooo
oolooloo
oolooloo
Iooooool
IoIIlIllolI
Bei-
5Sig-
Bit
fuer dieses
Farben (+*#)
definiert
Dezimal
Die Datenzeile muss nun natuerlich lauten
DATA 126, 66, 24, 24, 36, 36, 129, 190
Das Einschalten des Multicolor Modus erfolgt durch ...
POKE 53270, PEEK (53270) OR 16
Bei vorheriger Auswahl einer Farbe durch die Commodore-Taste
(!) und Druecken der Pfund-Taste wird nun ein Zeichen ausge-
geben, das aus zwei Diagonalen und zwei am oberen und unte-
ren Ende des Zeichens befindlichen Balken (in der spezifi-
zierten Farbe) besteht. Die Farben der Diagonalen haengen
von den Registern 53282 und 53283 ab, von denen das erstere
die Farbe der Diagonalen von links oben nach rechts unten
angibt und das zweite die der anderen Diagonalen. Aller-
dings, und das sollte unbedingt erwaehnt werden, ist die
Farbe nicht unbedingt so sauber, wie dies bei grossen Flae-
chen (Rahmen oder Hintergrund) der Fall ist. Sie haengt in
erster Linie vom verwendeten Fernseher beziehungsveise Moni-
tor ab. Durch POKE-Befehle lassen sich nun die Farben der
Diagonalen veraendern. Hier stehen jedoch, im Gegensatz zum
Bitpaar '1l1', alle 16 Farben frei zur Verfuegung.
Wird das definierte Zeichen allerdings mit einem Cursorfarb-
code von O bis 7 (oder bei geloeschtem Multicolor Bit) aus-
gegeben, so wird das Aussehen des Zeichens sich aendern, da
hier, wie dies auch beim Sigma der Fall war, dann nur noch
nach gesetzten und geloeschten Bits mit einer Aufloesung von
8 mal 8 Punkten unterschieden wird. Andererseits ergeben
sich recht interressante Effekte, wenn bei eingeschaltetem
Multicolor Modus mit normalen Zeichen gearbeitet wird, die
im Mehrfarbenmodus dargestellt sind.
Auch hier ist es, wie dies in aehnlicher Form im Modus fuer
erweiterte Hintergrundfarben moeglich war, durch Aendern ei-
nes Registers moeglich, saemtliche zugehoerige Bitpaare (mit
Ausnahme des Bitpaars 11) auf einmal zu aendern. Diesem
Prinzip entspricht uebrigens auch die Aenderung der Hinter-
grundfarbe im normalen Darstellungsmodus. Hier werden saent-
liche Bits mit dem Wert O (die man als 'nicht sichtbar' be-
zeichnen wuerde, da sie der Hintergrund des Zeichens sind)
in einer globalen Farbe dargestellt, im Gegensatz zu den ge-
setzten Bits, die die zugehoerigen Dots in der im Color
Nybble RAM spezifizierten Farbe erscheinen lassen. So sind
im Multicolor Modus drei globale Farben vorhanden.
48
Die bis hier beschriebenen Darstellungsmodi, die sich alle
unter dem Begriff "Zeichendarstellung" zusammenfassen las-
sen, sind alle Moeglichkeiten der Darstellung bei Zugriff
auf den Zeichengenerator.
Die hochaufloesende Graphik (HIRES, High Resolution)
Zusaetzlich zu den vorher beschriebenen Darstellungsmodi,
die in irgendeiner form auf einen Zeichengenerator zugrei-
fen, existiert ein weiterer Darstellungsmodus, in dem jeder
der 64000 Bildpunkte getrennt angesprochen werden kann. Die-
ser Modus wird daher 'hochaufloesend' genannt. Er eignet
sich speziell fuer die Darstellung von mathematischen Funk-
tionen, die mit grosser Genauigkeit aufgeloest werden koen-
nen, oder als Hintergrund fuer Spiele, da Sprites auch mit
HIRES-Graphiken kombinierbar sind.
Eine Programmierung dieses Bit Map Modus (jedes Bit aus dem
fuer die hochaufloesende Graphik spezifizierten Bereich ist
fuer einen Bildschirmpunkt zustaendig) ist sehr aufwendig.
BASIC ist hierzu speziell aus Geschwindigkeitsgruenden nur
sehr bedingt geeignet. Man wird bei groesseren Programmen
auf die Verwendung von Maschinenprogrammen zum Setzen und
Loeschen von Punkten, Linien und Flaechen wohl nicht ver-
zichten koennen, falls nicht gar das gesamte Programm in Ma-
schinensprache geschrieben werden muss.
Fuer die hochaufloesende Graphik wird ein Bereich von 8000
Bytes an Speicher benoetigt, der im Normalfall von BASIC-
Speicher abgezweigt werden muss. Diese B KB werden direkt
auf dem Bildschirm dargestellt. Es ist daher moeglich, den
Zustand (genaugenommen die Farbe) eines jeden Punktes direkt
zu aendern. Wie auch bei der Darstellung von Zeichen aus dem
Zeichengenerator, so existieren auch im Bit Map Modus unter-
schiedliche Formen. Dies ist der Standard Bit Map Mode und
der Multicolor Bit Map Mode. Die horizontale Aufloesung
wird, wie dies bei mehrfarbigen Zeichen auch der Fall war,
im Multicolor Bit Map Modus auf die Haelfte (160 doppelte
Dots) reduziert, da auch hier immer zwei Dots gleichzeitig
angesprochen werden. In beiden Modi bekommt ausserdem die
Videomatrix eine neue Bedeutung. Durch sie werden nun zwei
der moeglichen Farben innerhalb eines Feldes von 8 mal 8
Dots festgelegt.
Das Einschalten des Bit Map Modus' erfolgt durch Setzen von
Bit 5 in Register 17 (Adresse 53265), die Startadresse des
8-KB-Bereichs (wodurch sich durch die 16-KB-Architektur des
VIC-II-Chips zwei Moeglichkeiten ergeben) wird durch Bit 3
in Register 24 (Adresse 53272) festgelegt (natuerlich muss
auch hier wieder die Startadresse der Video-Bank addiert
verden):
Adressbereich Bitwert
0 - 7999 0
8192 - 16191 l
Dieses Bit wird auch zur Festsetzung der Startadresse des
Zeichengenerators benutzt, der jedoch im HIRES-Modus nicht
verwendbar ist. Die Startadresse des Zeichengenerators muss
daher wieder neu gesetzt werden, falls in einen Modus ge-
schaltet werden soll, der den Zeichengenerator benoetigt.
Der Bereich von O bis 7999 kann in Video-Bank 0 natuerlich
nicht benutzt werden, da ansonsten wichtige Systemadressen
ueberschrieben werden muessten.
49
Standard Bit Map Modus
In diesem Modus bleibt das Color Nybble RAM unbeachtet, nur
die Videomatrix und der B-KB-Bereich fuer die 64000 Punkte
werden verwendet. Das erste Byte aus dem 8-KB-Bereich ist
fuer die ersten acht Punkte zustaendig. Dabei erfolgt die
Unterteilung innerhalb des Bytes von Bit 7, erster Dot (oben
links) bis Bit O, achter Dot. Das zweite Byte bestimmt die
ersten acht Dots innerhalb der zweiten Dotzeile. Dies geht
so weiter bis zum achten Byte, das die ersten acht Dots der
achten Dotzeile bestimmt. Ab dem neunten Byte wird nun wie-
der in die erste Zeile zurueckgegangen. Hier bestimmen die
Bitzustaende nun das neunte bis sechzehnte Dot von links.
Auch dieses Prinzip wird (wie man sich bei einer horizonta-
len Aufloesung von 320 Dots leicht ausrechnen kann) bis zum
320sten Byte fortgesetzt. Die nun folgenden 320 Bytes be-
stimmen.die Dotzustaende der Zeilen 9 bis 16. Dieses geht so
veiter, bis alle der 320 mal 200 Punkte bearbeitet sind. Al-
lein an dieser zwar sehr logischen aber doch fuer BASIC sehr
umstaendlich zu handhabenden Aufteilung erkennt man, dass
wohl viel Zeit allein fuer die Berechnung der Bitposition
benoetigt wird. Hier eine Darstellung fuer den Aufbau des
Bildschirms aus den zugehoerigen Bytes:
Spalte
0 - 7 8 - 15 ....304 - 311 312 - 319
Reihe 0: Byte 0, Byte 8, ..., Byte 304, Byte 312
Reihe l: Byte l, Byte 9, ...,;, Byte 305, Byte 313
.oeo.o oe. .v.., .ee0 .o...,. ...;,. .oe oe ...,9 .eoo .oeeo
Reihe 6: Byte 6, Byte 14, ..., Byte 310, Byte 318
7: Byte 7, Byte 15, ..., Byte 311, Byte 319
8: Byte 320, Byte 328, ..., Byte 624, Byte 632
Reihe 9: Byte 321, Byte 329, ..., Byte 625, Byte 633
‘ “. ve ...y ...,. oe... ..oyg .oeo oe».
Reihe 14: Byte 326, Byte 334 ..., Byte 630, Byte 638
Reihe 15: Byte 327, Byte 335, ..., Byte 631, Byte 639
Reihe 192: Byte 7680, Byte 7688, ..., Byte 7984, Byte 7992
Reihe 193: Byte 7681, Byte 7689, ..., Byte 7985, Byte 7993
.... .oeo ua ee ZUR } ...;,- .oeoe
ie re We RT eg en
Reihe 198: Byte 7686, Byte 7694, ..., Byte 7990, Byte 7998
Reihe 199: Byte 7687, Byte 7695, ..., Byte 7991, Byte 7999
Ist nun ein Bit gesetzt, so wird die Farbe des zugehoerigen
Punktes vom hoeherwertigen Nybble (MSN, most significant
nybble) innerhalb der Videomatrix bestimmt, bei geloeschten
Bits ist dies das niedervwertige Nybble (LSN, least
significant nybble) der Videomatrix:
Bitvert Farbe spezifiziert durch
0 LSN (Bits 0 - 3) des zugehoerigen Videomatrixbytes
l MSN (Bits 4 - 7) des zugehoerigen Videomatrixbytes
Es stehen also zwei unterschiedliche Farben, die NICHT aus
dem Color-Nybble-RAM stammen, innerhalb eines 8 mal B Feldes
zur Verfuegung. Bei der Darstellung von Funktionen werden
sich diese beiden Farben wohl ueber den gesamten Bildschirm
erstrecken, wobei dann eine Farbe als Hintergrundfarbe ver-
wendet werden wird und eine andere Farbe fuer den Funktions-
50
graphen selbst. Bei vier zur Verfuegung stehenden Bits fuer
jede Farbe koennen daher alle sechzehn Farben verwendet ver-
den.
Hier noch eine. Umrechnungmethode in Form eines BASIC-Unter-
programms, das durch GÜSUB aufgerufen werden kann. Die Va-
riablen X und Y geben die Koordinate des zu setzenden Punkts
an:
B = 8192 + (X AND 504) + 40 * (Y AND 248) + (Y AND 7)
POKE B, PEEK (B) OR 2 # (7 - (X AND 7)) = RETURN
Dieses Programm geht von einem Bit Map Bereich von 8192 bis
16191 aus. Wie erkennbar, ist dieses Programm sehr leicht in
Maschinensprache zu uebersetzen, da saemtliche Operationen
direkt durchfuehrbar sind (teilweise jedoch 16 Bit). Die
Multiplikation mit 40 muss in mehreren Schritten durchge-
fuehrt werden: Als erstes wird der Operand mit 4 multipli-
ziert, dann wird der ÜOperand selbst noch einmal addiert
(dies entspricht einer Multiplikation mit 5). Das Ergebnis
wird dann noch dreimal linksverschoben. Eine Potenzierung
zur Basis zwei kann durch Verschiebung eines gesetzten Bits
innerhalb eines Bytes erfolgen.
Zum Loeschen eines Punktes muss in der obigen Routine ledig-
lich der POKE-Befehl etwas geaendert werden:
POKE B, PEEK (B) AND 255 - 2 (7 - (X AND 7))
Um nun zum Beispiel eine Sinuskurve auf den Bildschirm zu
bringen, kann folgendes Programm verwendet werden:
POKE 53280, 14 : POKE 55, O : POKE 56, 32 : CLR
FOR I = 8192 TO 16191 : POKE I, DO : NEXT
FOR I = 1024 TO 2023 =: POKE I, 1 : NEXT
POKE 53272, PEEK (53272) OR 8
POKE 53265, PEEK (53265) OR 32
FOR X = 0 TO 319 : Y = 100 - 100 * SIN (X * pi / 160)
GOSUB punktsetzroutine : NEXT
Dabei ist mit 'pi' natuerlich die Shift-Funktion der Taste
zwischen 'RESTORE' und '*' gemeint. Als Punktsetzroutine
kann zum Beispiel die obige verwendet werden. Um die durch
das Wort 'READY.' erzeugten Farbfelder zu vermeiden, kann
man am Ende des Programms eine Endlosschleife anfuegen.
Der Abbruch sollte durch RUNSTOP und RESTORE erfolgen, da
dann wieder in den Normalmodus zurueckgekehrt wird. Der
Pointer auf das Ende des Arbeitsspeichers kann dann auch
wieder rueckgesetzt werden. In diesem speziellen Programm
waere es nicht einmal noetig gewesen, den Pointer (55/56) zu
aendern, da keinerlei Strings verwendet werden. Die Ablage
von Variablen ist jedoch bereits anderweitig erklaert.
Multicolor Bit Map Modus
Waehrend im Standard Bit Map Modus nur zwei verschiedene
Farben für jeden Punkt zur Verfuegung stehen, so sind dies
im Multicolor Modus vier verschiedene Farben. Mehrere Farben
koennen benoetigt werden, wenn zum Beispiel zwei verschie-
denfarbige Linien sich kreuzen oder einfach, um bessere
Farbgraphiken zu erstellen. Wie dies beim Multicolor Modus
fuer Zeichen jedoch auch der Fall war, so muss auch hier die
Haelfte der horizontalen Aufloesung geopfert werden. Es ste-
hen hier also noch 160 (horizontal) mal 200 (vertikal) dop-
pelte Dots zur Verfuegung, da auch hier jeweils zwei Bits an
51
Daten im Bit Map Speicherbereich fuer zwei Dots Gueltigkeit
haben.
Initialisiert wird der Multicolor Bit Map Modus durch Setzen
des Multicolor Bits (Bit 4) in Register 22 (Adresse 53270)
sowie natuerlich durch Setzen des Bits fuer den Bit Map Mo-
dus, Bit 5 in Register 17 (Adresse 53265).
Die Anordnung der Bytes auf dem Bildschirm bei eingeschalte-
tem Multicolor Modus ist identisch mit der des Standard Bit
Map Modus. Lediglich die Bedeutungen der Bits innerhalb ei-
nes Bytes sind unterschiedlich. Bei zwei Bits an Daten fuer
jeweils zwei Dots stehen folgende vier Moeglichkeiten zur
Auswahl:
Bitpaar Farbquelle Funktion
00 Background #0 (53281) Hintergrund
01 MSN (Videomatrix) Hintergrund
10 LSN (Videomatrix) Vordergrund
11 Color Nybble RAM Vordergrund
Die Spalte 'Funktion' steht auch hier im Zusammenhang mit
den Sprites.
Wie ersichtlich, existiert eine globale Farbe fuer den ge-
samten Bildschirm. Ausserdem stehen innerhalb eines jeden B8
mal 8 Feldes weitere drei Farben zur Verfuegung. Innerhalb
eines 8 mal 8 Feldes koennen daher maximal vier Farben Ver-
wendung finden. Waehrend das Farb-RAM im Standard Bit Map
Mode unbenutzt war, dient es hier als Farbquelle bei der
Darstellung des Bitpaars '1l1l'.
Die SPRITES (Movable Object Blocks, MOBs)
Die Sprites sind, um es einmal ganz bescheiden auszudruek-
ken, das absolute Nonplusultra des VIC-II-Chips. Durch sie
ist es zum Beispiel moeglich, Spielprogramme so zu vereinfa-
chen, dass selbst in BASIC noch schnelle Graphikspiele pro-
blemlos auch fuer den Einsteiger zu programmieren sind. In
Maschinensprache ergibt sich dann sogar die Steigerung die-
ses Superlativ, da man viele Moeglichkeiten (gerade im Zu-
sammenhang mit der hochaufloesenden Graphik) von- BASIC aus
gar nicht voll ausnutzen kann.
Bei den Sprites handelt es sich um eine Art uweberdimensio-
niertes Zeichen in einer Groesse von 24 (horizontal) mal 2]
(vertikal) Bildschirmpunkten. Diese 504 Punkte eines Sprites
koennen beliebig gesetzt und geloescht werden, so wie das
bei der hochaufloesenden Graphik auch der Fall war. Sprites
koennen ausserdem mit jedem Bildschirmmodus uneingeschraenkt
kombiniert werden, ganz gleich, ob es sich dabei um die
hochaufloesende Graphik, einen Multicolor Modus oder die
Darstellung von einzelnen (durch den Zeichengenerator defi-
nierten) Zeichen handelt.
Die Programmierung der Sprites erfolgt unabhaengig von der
des restlichen Bildschirms. So muss bei der Erstellung fuer
die Graphik eines Spiels in keinster Weise auf die Bewegun-
gen der MOBs Ruecksicht genommen werden. Allerdings ist es
moeglich, Kollisionen eines Sprites mit dem webrigen Bild-
schirm oder mit anderen der wingesamt acht verchiedenen
Sprites zu erkennen. Es muessen daher noch nicht einmal Ab-
fragen auf die Positionen der Sprites in ein Programm einge-
baut werden, da diese Ueberpruefungen bereits durch den MOS
6567 durchgefuehrt werden.
52
Jedes Sprite laesst sich in X- und Y-Richtung bewegen. Man
gibt dem VIC-II-Chip dazu nur die gewuenschte Position an,
worauf das Sprite an diese Position gesetzt wird. Auch sind
Ueberlagerungen von Sprites, Bildschirmvorder- und Hinter-
grund moeglich, so dass der Eindruck einer dreidimensionalen
Darstellung erreicht werden kann.
Der Aufbau der Sprites
Jedes Sprite besteht aus 504 Punkten, die einzeln beein-
flusst werden koennen. Ein Sprite stellt also ein kleines
Gebiet hochaufloesender Graphik dar. Um diese 504 Punkte zu
definieren, benoetigt man 63 Bytes, da jedes Byte aus 8 Bit
(und jedes Bit ist fuer einen Dot zustaendig) besteht. Diese
63 Bytes werden in einem Block im Arbeitsspeicher abgelegt.
Die Zuordnung der Bytes innerhalb des Gebiets von 24 mal 21
Punkten ist folgendermassen: Das erste Byte bestimmt die er-
sten acht Punkte der ersten Zeile, das zweite Byte die Punk-
te 9 bis 16, das dritte die Punkte 17 bis 24 der ersten Zei-
le. Die naechsten drei Bytes sind fuer die zweite Zeile zu-
staendig. Dies geht so bis zum 21. Block von drei Bytes wvei-
ter. Innerhalb eines Bytes ist (wie dies auch bei der Defi-
nition von eigenen Zeichen oder bei der hochaufloesenden
Graphik der Fall war) Bit 7 dem ersten Bildschirmpunkt in-
nerhalb der Reihe von acht Punkten zugeordnet, Bit 0 ent-
sprechend dem letzen Dot. Zum Aufbau hier noch eine anschau-
liche Darstellung:
Spalte
0- 7 8 - 15 16 - 23
Zeile 0: Byte 0, Byte 1], Byte 2
Zeile 1: Byte 3, Byte 4, Byte 5
Zeile 2: Byte 6, Byte 7, Byte 8
Zeile, 3: Byte 9, Byte 10, Byte 11
Zeile 17: Byte 51, Byte 52, Byte 53
Zeile 18: Byte 54, Byte 55, Byte 56
Zeile 19: Byte 57, Byte 58, Byte 59
Zeile 20: Byte 60, Byte 61, Byte 62
Da jedes Bit. eines Bytes der Sprite-Daten einem Dot des
Sprites zugeordnet ist, ergeben sich fuer die Bedeutung der
Bits folgende Moeglichkeiten:
Bitvert Bedeutung
0 transparent, keine Aenderung des Bildschirmbildes
1 Darstellung des Punktes in der Farbe des MOBs
Im Gegensatz zu den Bedeutungen der Bits bei den anderen
Bildschirmmodi ergibt sich aus dem Bitwert OD hier keine Dar-
stellung des Punktes in der Hintergrundfarbe. Vielmehr wird
dieser Spritepunkt ueberhaupt nicht beachtet, so dass die
Daten, die normalerweise an dieser Stelle auf dem Bildschirm
stehen, weiterhin sichtbar bleiben.
Die Farbe des MOBs, also die Farbe der Punkte, deren Daten-
bits gesetzt sind, wird in den Registern 39 bis 46 des VIC-
II-Chips festgelegt. Diese Register liegen an den Adressen
53287 bis 53294, deren untere vier Bits (LSN) den Farbcode
enthalten. In diesen Registern koennen die oberen 4 Bits un-
beachtet bleiben (es muss also der fFarbwert nicht mittels
'AND' und 'OR' festgesetzt werden), da diese keinerlei Funk-
53
tion haben. Somit kann ein Sprite in jeder der sechzehn Far-
ben dargestellt werden.
Sprites belegen einen "geraden" Block von 64 Bytes, wovon
nur die ersten 63 Bytes benutzt sind. Es stehen also winner-
halb eines 16-KB-Bereichs insgesamt 256 Moeglichkeiten der
Ablage von Sprite-Daten zur Verfuegung. Soll zum Beispiel
ein Sprite ab der Adresse 832 abgelegt werden, so ist dies
der 64-Byte-Block mit der Nummer 13 (von Nummer 0 ausge-
hend). Die Ablage dieser Nummern fuer die acht MOBs erfolgt,
wie schon bei der Erklaerung der Videomatrix angedeutet, am
Ende der 24 restlichen Bytes des 1024-Byte-Bereichs des
Bildschirmspeichers. Dies ist im Normalfall der Bereich von
2040 bis 2047, wobei 2040 die Startadresse von Sprite Nummer
0 angibt. Sollten also die Daten fuer Sprite Nummer 5 ab der
Adresse 832 abgelegt werden, so muesste dies dem VIC-II-Chip
durch ...
POKE 2045, 13
... mitgeteilt werden. Die Angabe der Position der Sprite-
Daten ist allerdings nicht genug. ‚Jedes Sprite verfuegt au-
sserdem noch ueber einen Schalter, der angibt, ob: dieses
Sprite momentan auch auf dem Bildschirm dargestellt werden
soll. Diese acht Schalter befinden sich im Register 2]1
(Adresse 53269) des Video-Chips. Jedes Bit (von Bit 0 bis
Bit 7) ist dem entsprechenden Sprite (Spritenummer identisch
mit Bitnummer) zugeordnet. Ist ein solches Bit gesetzt, so
wird das Sprite entsprechend den Daten dargestellt. Ist es
geloescht, so existiert dieses Sprite nicht. Es wird in kei-
ner Form auf die Daten zugegriffen oder aehnliches.
Ausserdem laesst sich jedes Sprite sowohl in X-Richtung als
auch in Y-Richtung in seiner Ausdehnung verdoppeln. Somit
kann ein MOB maximal eine Ausdehnung von 48 mal 42 Punkten
haben. Eine Verbesserung der Aufloesung wird damit aber
nicht erreicht. Jeder Bildschirmpunkt wird lediglich in zwei
Zeilen und/oder Spalten dargestellt, so dass der MOB in dop-
pelter/vierfacher Groesse erscheint.
Diese Erweiterung in X- oder Y-Richtung wird durch die Regi-
ster 29 (Adresse 53277, X-Erweiterung) und Register 23
(Adresse 53271, Y-Erweiterung) festgelegt. Auch hier sind
die Bits von Bit O bis Bit 7 den Sprites von O bis 7 zuge-
ordnet. Ist ein Bit in einem dieser Register gesetzt, so
wird das entsprechende Sprite in die ausgewaehlte Richtung
verbreitert.
Zusaetzlich existiert noch das Prioritaetsregister, auf das
aber erst spaeter im Zusammenhang mit Kollisionen eingangen
werden soll. Es befindet sich an der Adresse 53275 und wird
im folgenden erst einmal unbeachtet belassen.
Nun zur Festlegung der Position des Sprites auf dem Bild-
schirm: Jedes Sprite kann an jeder Stelle des Bildschirms
stehen. In horizontaler Richtung ergeben sich, resultierend
aus der Bildschirmbreite von 320 Punkten und der Sprite-
breite von 24 Punkten, insgesamt 297 verschiedene Positio-
nen, in denen das Sprite vollstaendig dargestellt ist. Dies
sind die X-Werte im Bereich von 24 bis 320. Dabei beziehen
sich diese Werte auf die linke obere (eventuell, je nach
Sprite-Daten, auch nicht vorhandene) Ecke des Spriteblocks.
Ist ein X-Wert von 24 gewaehlt, so befindet sich die linke
Kante des Spriteblocks am Rand des linken Bildschirmrahmens.
Die 180 vollstaendig sichtbaren Y-Werte liegen von 50 bis
229. Werden Werte ausserhalb dieses Bereiches gewaehlt, so
54
ist das Sprite nur teilweise sichtbar. So ist es zum Bei-
spiel moeglich, ein Sprite langsam auf dem Bildschirm er-
scheinen zu lassen.
Die Festlegung der Sprite-Koordinaten geht folgendermassen
vor sich:.
Register 1 (Adresse 53249) enthaelt die Y-Koordinate des er-
sten Sprites (Nummer O0). Wie bereits erwaehnt, bevirken man-
che Werte nur eine teilweise (oder gar keine) Darstellung
des Sprites au dem Bildschirm.
Register O0 (Adresse 53248) sowie Bit 0 von Register 16
(Adresse 53264) bilden zusammen das Register fuer die X-Ko-
ordinate des Sprites Nummer O mit einer Breite von 9 Bits.
Dies ist notwendig, da der Bildschirm eine Breite von mehr
als 256 Dots hat. Bei X-Werten im Bereich von OD bis 255 ist
demnach Bit O0 von Register 16 geloescht. Ist es gesetzt,
liegt der X-Wert im Bereich von 256 bis 511. Auch hier fueh-
ren manche Werte wieder zu einer unvollstaendigen Darstel-
lung des MOBs.
Zum langsamen Erscheinen von Sprites: Hat ein Sprite die
normale Groesse von 24 mal 21 Punkten, so ist es moeglich,
diesen Sprite von jeder Seite aus in einzelnen Rasterzeilen
auf den Bildschirm zu bevegen. Ist der Sprite jedoch in
X-Richtung verdoppelt worden, so ist er zu breit, um "unter"
dem linken Rand versteckt zu werden. In X-Richtung erveiter-
te Sprites sollten daher nicht am linken Rand in Erscheinung
gebracht werden, falls auf ein stueckweises Erscheinen Wert
gelegt wird. Bei der Verbreiterung in Y-Richtung entstehen
keinerlei Probleme. Auch bei verbreiterten MOBs geben die
Koordinatenregister die Position der linken oberen Ecke an
(eine Verbreiterung erfolgt nach rechts oder unten, nicht um
den urspruenglichen Sprite herum), die linke obere Ecke ver-
aendert ihre Position nicht.
Die Koordinaten des Sprites Nummer ]l werden in den Registern
2 (Y-Koordinate) sowie Register 3, das zusammen mit Bit ]1
von Register 16 wieder den 9-Bit-breiten Wert fuer die X-Ko-
ordinate ergibt, festgelegt. Die Koordinatenregister der
veiteren Sprites liegen (auch jeweils paarweise plus einem
zusaetzlichen Bit aus Register 16) in den Registern 4 bis 15
(jeweils die acht niedervwertigen Bits fuer die X-Koordinate
im ersten Register, dann die Y-Koordinate).
Hierzu jetzt endlich ein Beispiel: Folgender Pac-Man ("Pac-
Man" ist ein Warenzeichen der Firma ATARI) soll als ein
Sprite definiert werden:
DI ATINLBIEDDOAITNIN LINIEN
Te retten febjab jerb ja jan jan fan jmuh
55
Um aus diesem Muster nun ein Programm zu machen, das diese
Figur auf den Bildschirm bringt, muessen zuerst saemtliche
63 Bloecke zu je acht Punkten in Dezimalwerte umgewandelt
verden. Dazu muss in der gleichen Weise vorgegangen werden,
vie bei der Definition eigener Zeichen auch. Die daraus er-
haltenen 63 Zahlen muessen dann in DATA-Zeilen eingebaut
werden. Die Anordnung erfolgt wie zuvor angegeben: von Zeile
0 bis Zeile 20 und innerhalb der Zeilen die Bytes von links
nach rechts. Man erhaelt fuer den "Pac-Man" folgende Werte
fuer die DATAs:
100 DATA 0, 127, 0 210 DATA 255, 254, 0
110 DATA 3, 255, 192 220 DATA 255, 254, 0
120 DATA 15, 255, 240 230 DATA 255, 255, 0
130 DATA 31, 255, 248 240 DATA 127, 255, 128
140 DATA 63, 243, 252 250 DATA 127, 255, 192
150 DATA 127, 243, 254 260 DATA 63, 255, 224
160 DATA 127, 255, 254 270 DATA 31, 255, 240
170 DATA 255, 255, 252 280 DATA 15, 255, 224
180 DATA 255, 255, 240 290 DATA 3, 255, 192
190 DATA 255, 255, 192 300 DATA 0, 127, 0
Die folgende Zeile dient dazu, diese Werte im Bereich von
832 bis 894 abzulegen ...
310 FOR I = 832 TO 894 : READ A : POKE I, A : NEXT
Sollen nun Sprite Nummer DO diese Daten (im Speicherblock 13)
zugeordnet werden, so erreicht man dies durch
320 POKE 2040, 13
Ausserdem muss dieser Sprite nun noch eine Farbe (gelb) be-
kommen und die Freigabe fuer die Ausgabe auf dem Bildschirm
muss erfolgen:
330 POKE 53287, 7 : POKE 53269, 1
Durch diese Zeile wird nun noch die Figur ueber den Bild-
schirm bevegt:
340 FOR I = 0 TO 255 : POKE 53248, I : POKE 53249, I : NEXT
Bevor Sie das Programm durch 'RUN' starten, sollten Sie noch
einmal "RUNSTOP" und "RESTORE" druecken, damit eventuell
noch vorhandene Restparameter aus anderen Programmen aus dem
Video-Chip entfernt werden (Initialisierung des VIC-II-
Chips). Die Figur wird nun diagonal ueber den Bildschirm be-
vegt.
Diese Figur kann nun natuerlich auch noch in X-Richtung und
Y-Richtung vergroessert werden. Bauen Sie doch noch einmal
zusaetzlich eine der folgenden Zeilen ein:
335 POKE 53271, 1 : POKE 53277, 0
335 POKE 53271, O0 : POKE 53277, 1
335 POKE 53271, 1 : POKE 53277, 1
Soll Ihr "Pac-Man" nun auch noch Fressbewegungen machen, so
muessen Sie saemtliche verschiedenen Figuren erst einmal in
verschiedenen 64-Byte-Bloecken ablegen. Um nun die verschie-
denen Figuren auch erscheinen zu lassen, wird einfach der
Zeiger auf den Datenblock (bei diesem Beispiel in Adresse
2040) der naechsten Figur gesetzt. So wird eine bewegte
Spielfigur gezeigt, ohne dass die Daten ausgetauscht werden
56
muessen. Ein Datenblock kann jederzeit verschiedenen Sprites
gleichzeitig zugeordnet sein. Besteht ein Spiel also aus
mehreren gleichen Figuren, so muessen die Daten dazu nur
einmal vorhanden sein.
Multicolor Sprites
Auch Sprites lassen sich im Multicolor Modus darstellen.
Dies ermoeglicht es dem Programmierer, einem Sprite drei
Farben (plus transparent) zuzuordnen. Jedoch werden auch
hier jeweils zwei Bits der Daten verwendet, um die Farbe zu
spezifizieren, so dass sich die horizontale Aufloesung auf
12 doppelte Punkte halbiert. Da aber (wie in allen Multico-
lor Modi) immer zwei Punkte auf einmal angesprochen werden,
veraendert sich die Spritegroesse nicht. Sprites lassen sich
unabhaengig voneinander in den Multicolor Modus schalten.
Die geschieht durch das Setzen des entsprechenden Bits in
Register 28 (Adresse 53276). Bit O ist hier Sprite Nummer O0
zugeordnet, Bit 7 ist fuer Sprite Nummer 7 zustaendig. Auch
Multicolor Sprites lassen sich vergroessern; dies erfolgt in
gleicher Weise, wie bei normalen Sprites auch.
Hier die Bedeutungen der Bitpaare:
Bitpaar Farbquelle
00 transparent
01 MOB Multicolor #0 (Register 37)
10 MOB Farbe (Register 39 bis 46)
11 MOB Multicolor #1 (Register 38)
Wie erkennbar, existiert fuer Multicolor MOBs also eine ei-
gene Farbe fuer jeden MOB sowie zwei globale Farben, die
fuer alle MOBs verwendet werden. Diese beiden globalen Far-
ben befinden sich in den Adressen 53285 und 53286. Auch hier
koennen die Farbwerte (von O bis 15 fuer alle sechzehn Far-
ben) ohne Beruecksichtigung der hoeherwertigen Bits (wie das
bei allen Farbregistern der Fall ist) direkt in das Register
eingeschrieben werden, da die hoeherwertigen Bits keinerlei
Bedeutung haben.
Prioritaeten
Sprites haben untereinander und zu dem uebrigen Bildschirm
bestimmte Prioritaeten. Ueberlappen sich zum Beispiel nicht-
transparente Daten zweier Sprites, so werden die Daten des
Sprites mit der niedrigeren Nummer dargestellt. So verdeckt
bespielsweise Sprite Nummer O immer die Dots der wuebrigen
Sprites.
Anders ist dies im Zusammenhang mit dem uebrigen Bildschirm.
Hier ist es fuer den Benutzer frei waehlbar, ob die Sprites
vor oder hinter den Vordergrunddaten dargestellt werden
(Hintergrunddaten rangieren immer an unterster Stelle der
Prioritaet und werden daher immer von nichttransparenten Da-
ten verdeckt). Register 27 (Adresse 53275) enthaelt nun fuer
jeden MOB ein Prioritaetsbit. Ist dieses Bit gesetzt, so
werden MOB-Daten durch Vordergrunddaten verdeckt. Bei ge-
loeschtem Bit haben die MOB-Daten eine hoehere Prioritaet
und werden daher "ueber" den Vordergrunddaten dargestellt.
Im Zusammenhang mit den Prioritaeten erklaert sich nun auch
die Spalte 'Funktion' bei den Uebersichten ueber die Bedeu-
tungen der Bitpaare in den Multicolor Modi. Waehrend bei den
Standard Modi geloeschte Datenbits Hintergrund und gesetzte
Datenbits Vordergrund repraesentieren, so kann in den Multi-
57
color Modi mit zwei Hintergrundfarben gearbeitet werden, von
denen dann auch keine (weder '00', noch '01') andere Daten
verdeckt.
Dieses System hat allerdings einen kleinen Nachteil: Da bei
Ueberlagerung zweier MOBs zuerst die Prioritaet der MOBs un-
tereinander ausgevertet wird und dann erst die Prioritaet
zum Bildschirm, mag es in einigen Faellen zu einer "fal-
schen" Darstellung auf dem Bildschirm kommen, indem durch
ein MOB verdeckte Vordergrunddaten durch ein zweites Sprite
(mit niederer Nummer und daher hoeherer Prioritaet zum ande-
ren Sprite, aber niederer Prioritaet zum Bildschirmvorder-
grund) wieder "sichtbar" gemacht werden. Dies duerfte aber
in den meisten Faellen vernachlaessigt werden.
Kollisionen
In Spielen ist es wichtig festzustellen, ob sich Sprites be-
ruehren oder ob ein Sprite soeben Vordergrunddaten ueber-
lappt. Alle diese Faelle werden naemlich durch den VIC-II-
Chip bereits geprueft. Es muessen die fertigen Daten nur
noch ausgevertet werden.
Kollisionen zwischen Sprites
Treffen nichttransparente Daten zweier (oder mehr) Sprites
zusammen, so wird in Register 30 (Adresse 53278) das ent-
sprechende Bit eines jeden Sprites gesetzt, das in dieses
Zusammentreffen verwickelt ist. Gleichzeitig wird Bit 2 des
Interrupt Latch Registers gesetzt, so dass (falls der Inter-
rupt freigegeben ist) der Prozessor in die Interruptroutine
verzweigen kann, wo dann die Kollision behandelt werden
kann.
Kollision zwischen Vordergrunddaten und Sprites
Auch hier wird beim Zusammentreffen eines Sprites mit Vor-
dergrunddaten (im Multicolor Modus gilt das Bitpaar '01',
wie im Zusammenhang mit den Prioritaeten, als Hintergrund)
fuer dieses Sprite in Register 31 (Adresse 53279) das zum
Sprite gehoerige Bit gesetzt. Hierbei wird dann Bit |] des
Interrupt Latch Registers gesetzt. Eine Behandlung von Kol-
lisionen zwischen Sprites und Vordergrunddaten kann daher
auch hier durch eine Interruptroutine erfolgen.
Kollisionen (allgemein)
Ein Bit in einem der Kollisionsregister bleibt solange ge-
setzt, bis das Register ausgelesen wird. Das zugehoerige Bit
im Interrupt Latch wird dann gesetzt, wenn mindestens ein
Bit in .einem der Kollisionsregister gesetzt wird. Bei fol-
genden Kollisionen wird dieses Latchbit NICHT gesetzt, falls
nicht vorher das Kollisionsregister gelesen wurde, auch wenn
das Latchbit mittlerweile geloescht wurde.
Die Interrupt-Register
Die Interrupt-Register ermoeglichen ausser der Erkennung von
Kollisionen noch die Abfrage des Lightpen-Eingangs und des
Rasteregisters (siehe jeweils dort).
Die Steuerung der Interrupts wird durch zwei Register des
VIC-II-Chips vorgenommen: Das erste ist das Interrupt Enable
Register (Register 26, Adresse 53274). In ihm wird festge-
legt, ob durch einen der vier faelle, die einen Interrupt
ausloesen koennen, auch die Interrupt-Leitung des Prozessors
58
auf Low gezogen werden soll. Die in diesem Register vervwen-
deten unteren vier Bits stehen fuer die vier Interruptquel-
len. Jede Interruptquelle kann also unabhaengig von anderen
Interrupts als Ausloeser eines IRQs freigegeben werden, um
so dem Prozessor mitzuteilen, dass ein zu behandelndes ETr-
eignis aufgetreten ist.
Freigegeben wird ein Interrupt, indem das zugehoerige Bit
des Interrupt Enable Registers auf den Wert 1 gesetzt wird.
Das Sperren einer Interruptquelle erreicht man entsprechend
durch das Loeschen des zugehoerigen Bits. Beim Auslesen wird
der entsprechende Wert zurueckgegeben (die unbenutzten Bits
4 bis 7 haben den Bitvert |)
Hier die Zuordnungen der Bits sowohl des Interrupt Latch Re-
gisters als auch des Interrupt Enable Registers:
Bitposition Zustaendig fuer Interruptquelle ...
Rasterregister
Kollision zwischen Sprite und Vordergrunddaten
Kollision zwischen Sprites
Negative Flanke auf Lightpen-Input
VUND-t+O
Unabhaengig davon, ob eine Interruptquelle als Ausloeser
freigegeben ist, wird im Interrupt Latch Register (Register
25, Adresse 53273) das zur Quelle gehoerige Bit gesetzt,
wenn ein entsprechendes Ereignis auftritt (Kollision etc.).
Ist ausserdem dieser Interrupt auch durch ein gesetztes Bit
im Interrupt Enable Register freigegeben, so wird zusaetz-
lich Bit 7 im Interrupt Latch Register gesetzt (ansonsten
ist Bit 7 geloescht). Dies signalisiert dem Programm, dass
die Interruptleitung zum Prozessor auf Low-Pegel gelegt wur-
de.
Dieses Bit 7 von Register 25 laesst sich verwenden, um in-
nerhalb der Interruptroutine zu erkennen, ob der VIC-II-Chip
Ausloeser fuer den Interrupt war, da schliesslich auch die
IRQ-CIA einen IRQ ausloesen kann. So kann gleich zu Beginn
der Routine festgestellt werden, ob eine Verzweigung in eine
Behandlungsroutine fuer den VIC-II-Chip erfolgen muss.
Ein gesetztes Latchbit im Interrupt Latch Register kann
durch Schreiben einer Eins in die gleiche Bitposition wieder
geloescht werden.
Das Raster Register
Dieses Register (Register 18, Adresse 53266 sowie Bit 7 von
Register 17, Adresse 53265) gibt die Zeile des momentan auf
den Bildschirm gebrachten Bildschirminhalts an. Dies kann
dazu verwendet werden, um bei Aenderungen des Bildschirm-
inhalts ein Flackern zu vermeiden. Man darf in diesem Fall
dann nur solche RAM-Bereiche aendern, die waehrend des Aen-
derungsvorganges nicht durch den VIC-II-Chip ausgelesen ver-
den.
Wird in dieses Register 18 (inklusive Bit 7 von Register 17)
schreibend zugegriffen, so wird dieser Wert in ein internes
Latch uebertragen. Erreicht das Raster Register diesen zwvi-
schengespeicherten Wert, so wird Bit O des Interrupt Latch
Registers gesetzt. Ist Bit O0 des Interrupt Enable Registers
gesetzt, so wird ausserdem ein IRQ ausgeloest. Das Raster
Register wird beim Commodore 64 dazu benutzt, um die Fern-
sehnorm/Taktfrequenz des Geraetes festzustellen.
59
Der Lightpen-Input
Bei Auftreten einer negativen Flanke auf dem Lightpen-Input
wird die momentane Bildschirmposition in ein Latch uebertra-
gen. Das Register 19 (Adresse 53267) enthaelt dann die acht
hoechstwertigen der neun fuer die X-Position zustaendigen
Bits. Daher betraegt die horizontale Aufloesung nur zwei
Dots. Die Y-Position zum Zeitpunkt der negativen Flanke wird
in Register 20 (Adresse 53268) wuebertragen (innerhalb des
sichtbaren Bereichs des Bildschirms reichen fuer die verti-
kale Aufloesung jedoch acht Bits aus). Je Einzelbild kann
aber nur einmal eine Uebertragung der Position in das Light-
pen Latch erfolgen.
Bei einer negativen Flanke am Lightpen-Input wird ausserdem
Bit 3 im Interrupt Flag Register gesetzt, so dass bei ge-.
setztem Bit 3 im Interrupt Enable Register ein IRQ ausge-
loest wird. Allerdings sollte in Programmen beachtet werden,
dass - durch Verwendung der Ports der IRQ-CIA sowohl fuer
die Tastatur als auch fuer die Kontrollports - auch durch
die Tastatur eine negative Flanke auf den Lightpen-Input ge-
geben werden kann.
SCREEN BLANKING
Wird Bit 4 in Register 17 (Adresse 53265) geloescht, so wird
der gesamte Bildschirm mit der Rahmenfarbe (Exterior Color,
Register 32) gefuellt. Der Prozessor greift nur noch waeh-
rend Phase 1 auf den Systembus zu, der Prozessor wird nicht
mehr angehalten, ihm steht also der gesamte Bus zur Verfue-
gung.
Allerdings wird bei aktiven Sprites trotzdem auf deren Daten
zugegriffen, falls Register 21 (MOB Enable) nicht auf den
Wert null gesetzt wurde.
Da waehrend der Recorderoperationen die CPU keinesfalls an-
gehalten werden darf (es handelt sich um sehr zeitabhaengige
Routinen), wird beim Commodore 64 waehrenddessen der Bild-
schirm auf die genannte Weise "abgeschaltet", um ein ein-
wandfreies Arbeiten des Computers zu gewaehrleisten. Sollten
waehrend dieses Zeitraums jedoch MOBs aktiviert sein, so
duerfte es vermutlich zu Lesefehlern kommen (falls ueber-
haupt Daten erkannt wurden).
Scrolling in einzelnen Punktzeilen
Unter "Scrolling" versteht man das Verschieben des Bild-
schirminhalts in eine bestimmte Richtung. Waehrend der Conm-
modore 64 den Bildschirminhalt im Normalfall nur nach oben
verschieben kann (wenn der Cursor ueber den unteren Bild-
schirmrand hinaus bewegt wird oder ueber den unteren Bild-
schirmrand hinaus gedruckt wird), so kann auch die Notven-
digkeit bestehen, den Bildschirminhalt in die anderen Rich-
tungen zu verschieben. Diese Eigenschaft hat zum Beispiel
ein sogenannter "SCROLLER", der zum Beispiel in EXBASIC
LEVEL II fuer den Commodore 64 enthalten ist. Beim Progranm-
mieren von BASIC ermoeglicht er es, BASIC-Programme ueber
den Bildschirm zu rollen, als waeren sie in einem Band vor-
handen. Das englische Wort "scroll" heisst schliesslich auch
"Schriftrolle". Wird mit dem Cursor ueber den Bildschirmrand
hinausgefahren, so wird die naechste oder vorherige (je
nachdem, ob der untere oder obere Bildschirmrand "ueber-
schritten" wurde) BASIC-Zeile automatisch gelistet, was die
Korrektur von Programmen erheblich vereinfacht. Diese Art
des Scrollens ist allerdings auch nur waehrend der Programm-
60
entwicklung verwendbar. Bei der Ausfuehrung eines Programms
muessen andere Moeglichkeiten vorhanden sein.
Beim Scrolling, das der VIC-II-Chip des Commodore 64 unter-
stuetzt, handelt es sich jedoch um ein Scrolling, das den
Bildschirminhalt in einzelnen Punktzeilen, aus dem die LCon-
putergraphiken aufgebaut sind, verschiebt, wohingegen das
normale BASIC-Scrolling immer um ganze Zeichen - bestehend
aus acht Punktzeilen - verschiebt (anders ist dies in BASIC
ja auch nicht sinnvoll).
Diese Moeglichkeit des Video-Chips kann dazu benutzt werden,
Daten und Informationen an den Benutzer langsam auf dem
Bildschirm erscheinen zu lassen. Waehrend der vVIC-II-Chip
dazu jedoch schon einen erheblichen Beitrag leistet, indem
er das Scrollen innerhalb eines Bereichs von acht Rasterzei-
len erledigt, so muss das eigentliche Scrollen um acht Ra-
sterzeilen (also um ein ganzes Zeichen) durch ein getrenntes
Maschinenprogramm selbst erfolgen.
Hier erst einmal das Prinzip des sogenannten "Smooth
Scrolling" in der Theorie:
Da die Daten, die auf den Bildschirm gescrollt werden sol-
len, langsam erscheinen und zeitweilig nur teilweise sicht-
bar sind (genauso wie die Zeichen, die langsam verschvin-
den), wird eine Pufferzone benoetigt, die die neuen Daten
aufnimmt und dann nach und nach auf den Bildschirm gebracht
wird. Diese Pufferzone in Form einer unsichtbaren Zeile oder
Spalte erhaelt man, indem man den Bildschirm einfach ver-
kleinert. Dieses ist bereits durch den VIC-II-Chip vorgese-
hen. Soll in horizontaler Richtung verschoben werden, so
kann der Bildschirm einfach auf eine Breite von 38 Zeichen
verkleinert werden. Ebenso ist es moeglich (bei vertikaler
Verschiebung des Bildschirminhalts), eine Verkleinerung auf
24 Zeilen zu erreichen. Es existieren nun "geschuetzte" Zei-
len, die nicht gesehen werden koennen (aber fuer den Compu-
ter immer noch vorhanden sind), da die Umrahmung nun eine
groessere Flaeche als zuvor einnimmt.
Die noch sichtbare Flaeche kann nun (je nachdem was verklei-
nert wurde) um jeweils acht Punktzeilen (wird durch drei
Bits in einem Register des Video-Chips festgelegt) verscho-
ben werden. Bei einem Extremvert (null oder sieben, je nach
Richtung) ist gerade eine Zeile (oder gar keine) des neuen
Zeichens zu erkennen, beim anderen Extremvert (sieben oder
null, je nach Richtung) das gesamte Zeichen (oder sieben
Zeilen davon).
Nach der Verkleinerung des Bildschirms wird zuerst das Regi-
ster fuer die einzelnen Zeilen auf den Maximal- oder Mini-
malwert gebracht (richtungsabhaengig, siehe Uebersicht).
Dann werden die neuen Daten "unter" dem Rand (also dorthin,
vo nur eine oder gar keine Punktzeile des Zeichens zu erken-
nen ist) plaziert. Darauf erfolgt die Verminderung/Erhoehung
des Registers, das fuer die Einzelzeilenverschiebung zu-
staendig ist. Ist der Minimal- beziehungsweise Maximalwert
erreicht, so wird das Maschinenprogramm aufgerufen. Es ver-
schiebt nun den Bildschirminhalt wirklich (also nicht nur
scheinbar gemaess der Darstellung) und setzt sofort darauf
das Einzelzeilenregister wieder auf den Anfangsvwert zurueck,
so dass wieder neue Daten plaziert werden koennen.
Die Verkleinerung auf eine Breite von 38 Zeichen je Zeile
(nur scheinbar!!!) erfolgt durch Loeschen von Bit 3 in Regi-
ster 22 (Adresse 53270) des VIC-II-Chips. Bit 3 von Register
61
17 (Adresse 53265) dient entsprechend zur vertikalen
Schrumpfung des Bildschirms auf 24 Zeilen.
Die Einzelzeilenregister zu je drei Bits (fuer acht ver-
schiedene Werte) befinden sich jeweils in den Bits 0 bis 2
von Register 22 (Adresse 56270) fuer die Verschiebung in
X-Richtung sowie Register 17 (Adresse 53265) fuer eine
Y-Verschiebung.
Hier eine Uebersicht, welche Register in welcher Weise be-
einflusst werden muessen, um eine Verschiebung in eine be-
stimmte Richtung zu erreichen:
m u m m m En m ab ED TE CE m ED TE CE EB ER ER ab a Ep Em CE EC ET > CE TE > ES u CD GE m En «ED CE EB <ED Em ED ED CD ED «ES En m CED Cm mp am
= 2 m ab CD CD CD CD ED CD m eb ED a am ED CE ED ED > m a ED En CED ED de CE ED ED CE ED Cup ED ED ED CED CED «ED GEB mb air dED mr CED «ED MED CAD CE GES (E> um am dm
m— m mm ED CE ED ED CD CD TE Em ED CE CD CD ED TR ED CE m TE TE En CD U Cu ED En CE TE En EEE u ED Ep ED CE EEE EB ED EU GE GE CE ED a Cum
I Scrollregister I Y I Y I X I X I
lanfanguert IT I oO ı 7 rı0o1
I Veraenertug I 1 I A I 1. 1
I Pufferrend I unten I oben I rechts I links I
Befindet sich der Wert null (als Anfangsvert) in einem
Scrollregister, so ragt unter dem Pufferrand (fuer neue Da-
ten) genau eine Punktzeile hervor. Wurde der Wert sieben in
eins der Scrollregister (ebenfalls als Anfangsvert) ge-
schrieben, so ist das ganze Zeichen (unter dem Pufferrand)
unsichtbar. Entsprechendes gilt fuer die Endwerte und
Pufferraender, in denen die Daten verschwinden.
Hierzu ein Beispiel: Es soll ein auf dem Bildschirm stehen-
der Text von unten nach oben Totiert werden, ohne dass neue
Daten zugefuehrt werden.
Es wird eine Maschinenroutine benoetigt, die den Bildschirm-
inhalt um eine Zeichenzeile nach oben verschiebt und die
obere Zeile dann wieder nach unten kopiert (dies entspricht
einem Rotieren des Bildschirminhalts).
Allerdings wird man bemerken, dass es damit allein nicht ge-
tan ist; wird naemlich das Einzelzeilenregister geaendert
(oder die Maschinenroutine aufgerufen), so wird man bemer-
ken, dass es zu einem Flackern auf dem Bildschirm kommt.
Dies liegt daran, dass es waehrend der Erstellung des Bildes
auf dem Bildschirm zu einer Aenderung der Darstellungsvweise
beziehungsweise der Daten kommt. Ein Teil des Bildes wird
nach den alten Daten erstellt, ein anderer Teil nach neuen
Daten. Dies gilt es zu verhindern. Waehrend das aber bei der
Einzelzeilenverschiebung noch recht einfach ist, so bereitet
es bei der Zeichenverschiebung schon Schwierigkeiten, da
auch Maschinenprogramme, wenn sie auch noch so schnell sind,
im Verhaeltnis zu der Zeit bei der Bilderstellung nicht
schnell genug sind.
Allerdings wurde dieses Flackern durch Abfrage des Raster-
zeilenregisters umgangen. Die Aenderung der Bildschirmdaten
erfolgt so, dass es nicht zu einer Ueberlappung (und damit
zu einem Flackern) kommen kann. Dies war aber nur durch An-
wendung einer nicht sehr eleganten Methode moeglich. Aber
62
schliesslich kam es hierbei auf Geschwindigkeit an. Hier das
fertige Programm:
100 FOR I = 828 TO 927 : READ A : POKE I, A : NEXT
110 DATA 120, 169, 251, 205, 18, 208, 208, 251, 206, 17, 208
120 DATA 88, 96, 120, 173, 17, 208, 16, 251, 72, 173, 17
130 DATA 208, 48, 251, 169, 107, 205, 18, 208, 208, 251, 160
140 DATA 40, 185, 255, 3, 153, 255, , 136, 208, 247, 185, 40
150 DATA 4, 153, , 4, 200, 208, 247, 185, 40, 5, 153, „5
160 DATA 200, 208, 247, 185, 40, 6, 153, , 6, 200, 208, 247
170 DATA 160, 64, 185, 232, 6, 153, 192, 6, 200, 208, 247
180 DATA 160, 39, 185, , 1, 153, 192, 7, 136, 16, 247, 104
190 DATA 9, 7, 141, 17, 208, 88, 96
200 POKE 53265, PEEK (56265) AND 240 OR 7 : C = PEEK (646)
210 FOR I = 55296 TO 56295 : POKE I, C : NEXT : N = 63
300 FOR I = 0 TO 6 : FOR J = O0 TON : NEXT : SYS 828 : NEXT
310 FOR J = 0 TO.N : NEXT : SYS 841 : GOTO 300
In Zeile 100 wird das Maschinenprogramm in den Bereich des
Cassettenpuffers eingelesen, da dieser normalerweise unbe-
nutzt ist (das Programm enthaelt jedoch keinerlei Absolut-
adressen und kann daher auch an jeder anderen Stelle im Ar-
beitsspeicher stehen). Die Daten fuer das Maschinenprogramm
stehen in den Zeilen 110 bis 190. Zwei aufeinanderfolgende
Kommas entsprechen uebrigens dem Wert null. Zeile 200 ver-
kleinert den Bildschirm auf 24 Zeilen und stellt die momen-
tane Cursorfarbe fest. Mit dieser Farbe wird nun das gesamte
Farb-RAM gefuellt. Mancher ahnt, was es damit auf sich hat:
Die Maschinenroutine verschiebt lediglich den Inhalt der Vi-
deomatrix im Bereich von 1024 bis 2023. Das Farb-RAM und
auch die Tabelle der Doppelzeilenkennzeichnungen (!) bleibt
unbeachtet, da dadurch die Routine zu langsam wuerde. Daher
sollte (wenn auf dem Bildschirm Programmzeilen verschoben
wurden) nach Abbruch auf jeden Fall der Bildschirm geloescht
verden, da es, -venn solche Programmzeilen editiert werden,
zu Techt. merkwuerdigen Effekten kommen kann.
Die Variable N ist der Wert fuer die Geschwindigkeit (Ver-
zoegerungsschleife). Dann wird der Bildschirm in sieben
Schritten jeweils um eine Punktzeile verschoben, wozu die
Routine ab der Adresse 828 dient. Sie wartet mit dem Vermin-
dern des Einzelzeilenregisters ab, bis es zu keinem flackern
kommen kann. Die Routine ab Adresse 841 verschiebt den Bild-
schirminhalt um eine Zeile nach oben und setzt das Einzel-
zeilenregister wieder auf den Anfangsvert zurueck. Auch hier
wird durch eine entsprechende Abfrage ein Flackern verhin-
dert.
Soll dieses Programm so abgeaendert werden, dass jeweils
neue Daten nachgefuellt werden, so muss nach Aufruf der Ver-
schieberoutine (SYS 841) die letzte Zeile mit den neuen Da-
ten gefuellt werden (achten Sie darauf, dass der Cursor
nicht ueber die letzte Zeile hinausfaehrt). Sind die neuen
Daten "unter" dem Bildschirmrand plaziert, so kann wieder
mit Zeile 300 fortgefahren werden.
Die folgenden Programme entsprechen dem obigen Programm, nur
wird jeweils in eine andere Richtung verschoben. Auch jedes
dieser Programme besteht aus zwei Teilen: ab Adresse 82B zum
Aendern des Einzelzeilenregisters sowie ab Adresse 84] zum
Verschieben um ein ganzes Zeichen. Lediglich beim Verschie-
ben des Bildschirminhalts nach UNTEN kam es zu zeitlichen
Problemen. Da hier der Bildschirminhalt von unten nach oben
geaendert werden muss (im Gegensatz zu den uebrigen Program-
men, die den Bildschirm von oben nach unten aendern), ist es
hier nicht mehr moeglich, die Bildaenderung so zu steuern,
63
dass diese nicht vom Zeilenstrahl "ueberholt" wird. So exi-
stieren zwei Einsprungstellen: die erste an der Stelle 850.
Hierbei kommt es zu einem Flackern, das jedoch durch geeig-
nete Abfragen auf ungefaehr die vier unteren Bildschirmzei-
len begrenzt werden kann. Die zweite Einsprungstelle befin-
det sich an der Adresse B4l. Hier wird nun der Bildschirm
"abgeschaltet" (siehe SCREEN BLANKING). Es sollte jedoch bei
Verwendung dieser Einsprungstelle die Farbe fuer den Rahmen
identisch mit der des Hintergrunds sein, da dann das Ab-
schalten am wenigsten stoert.
Scerolling nach LINKS:
100 FOR I = 828 TO 927 : READ A : POKE I, A : NEXT
110 DATA 120, 169, 251, 205, 18, 208, 208, 251, 206, 22, 208
120 DATA 88, 96, 120, 173, 17, 208, 16, 251, 173, 17, 208
130 DATA 48, 251, 169, 60, 205, 18, 208, 208, 251, 162, 39
140 DATA 134, 251, 232, 134, 253, 162, 3, 134, 252, 134, 254
150 DATA 24, 162, 25, 160, 217, 177, 251, 72, 177, 253, 145
160 DATA 251, 200, 208, 249, 136, 104, 145, 253, 165, 251
170 DATA 105, 40, 133, 251, 165, 252, 105, , 133, 252, 165
180 DATA 253, 105, 40, 133, 253, 165, 254, 105, , 133, 254
190 DATA 202, 208, 213, 173, 22, 208, 9, 7, 141, 22, 208, 88
200 DATA 96
300 POKE 53270, PEEK (53270) AND 240 OR 7 : CE = PEEK (646)
310 FOR I = 55296 TO 56295 : POKE I, C : NEXT : N = 63
320 FOR I = 0 T0 6 :: FOR J = 0 TO N : NEXT : SYS 828 : NEXT
330 FOR J = 0 TO N : NEXT : SYS 841 : GOTO 320
Scrolling nach RECHTS:
100 FOR I = 828 TO 927 : READ A : POKE I, A : NEXT
110 DATA 120, 169, 251, 205, 18, 208, 208, 251, 238, 22, 208
120 DATA 88, 96, 120, 173, 17, 208, 16, 251, 173, 17, 208
130 DATA 48, 251, 169, 73, 205, 18, 208, 208, 251, 162, 255
140 DATA 134, 251, 232, 134, 253, 162, 3, 134, 252, 232, 134
150 DATA 254, 24, 162, 25, 160, 39, 177, 253, 72, 177, 251
160 DATA 145, 253, 136, 208, 249, 104, 145, 253, 165, 251
170 DATA 105, 40, 133, 251, 165, 252, 105, , 133, 252, 165
180 DATA 253, 105, 40, 133, 253, 165, 254, 105, , 133, 254
190 DATA 202, 208, 214, 173, 22, 208, 41, 248, 1l4l, 22, 208
200 DATA 88, 96
300 POKE 53270, PEEK (53270) AND 240 : C = PEEK (646)
310 FOR I = 55296 10 56295 : POKE I, C : NEXT : N = 63
320 FOR IT =0T06 : FOR J =0 TO N : NEXT : SYS 828 : NEXT
330 FOR J = 0 TO N : NEXT : SYS 841 : GOTO 320
Scrolling nach UNTEN:
100 FOR I = 828 TO 924 : READ A : POKE I, A : NEXT
110 DATA 120, 169, 251, 205, 18, 208, 208, 251, 238, 17, 208
120 DATA 88, 96, 120, 173, 17, 208, 41, 239, 141, 17, 208
130 DATA 120, 160, 39, 185, 192, 7, 153, ,„ 1, 136, 16, 247
140 DATA 185, 192, 6, 153, 232, 6, 136, 208, 247, 136, 185
150 DATA 193, 5, 153, 233, 5, 136, 208, 247, 136, 185, 194
160 DATA 4, 153, 234, 4, 136, 208, 247, 160, 195, 185, 255
170 DATA 3, 153, 39, 4, 136, 208, 247, 160, 39, 185, , 1
180 DATA 153, , 4, 136, 16, 247, 173, 17, 208, 4l, 248, 9
190 DATA 16, 14l, 17, 208, 88, 96
300 POKE 53265, PEEK (53265) AND 240 : C = PEEK (646)
310 FOR I = 55296 TO 56295 : POKE I, C : NEXT : N = 63
320 FOR I =0T06 : FOR J = 0 TON : NEXT : SYS 828 : NEXT
330 FOR J = 0 TON : NEXT : SYS 841 : GOTO 320
64
Register
Register
Register
bis
Register
Register
Register
Register
Register
Register
Register
17:
18:
19:
20:
21:
Registeruebersicht fuer den VIC-II-Chip:
Die Adresse eines Registers errechnet sich aus
der Summe der Registernummer und der Start-
adresse 53248.
enthaelt die acht niedervwertigen der insgesamt
neun Bits der X-Koordinate von Sprite #0. Das
hoechstwertige Bit befindet sich in Bit 0 von
Register 16.
enthaelt die Y-Koordinate von Sprite #0. Hierzu
exisitiert kein weiteres Bit, da nur acht Bits
zur Darstellung der Y-Koordinate benoetigt ver-
den.
diese Register haben paarweise die gleiche Be-
deutung wie die Register 0 und 1, jedoch je-
weils fuer Sprite #1 bis Sprite #7.
hier befinden sich die acht hoechstvertigen
Bits der X-Koordinaten der Sprites. Dabei ist
jedem Sprite das jeweilige Bit mit der Nummer
des Sprites zugeordnet.
Bits 0 bis 2 enthalten den Wert der vertikalen
Verschiebung des Bildschirms in Rasterzeilen
(siehe Scrolling).
Ist Bit 3 geloescht, so werden nur noch 24 Zei-
len des Bildschirms dargestellt, ansonsten alle
25 Zeilen.
Ein Loeschen von Bit 4 bewirkt das Ausfuellen
des gesamten Bildschirms mit der Farbe des Rah-
mens (Bildschirm "ausschalten").
Bit 5 schaltet (wenn gesetzt) in den Bit Map
Modus um.
Bit 6 schaltet (wenn gesetzt) in den Extended
Color Mode (Modus fuer erweiterte Hintergrund-
farben).
Bit 7 ist das hoechstwertige Bit der neun Bits
des Rasterregisters.
Rasterregister (zusammen mit Bit 7 aus Register
17). Wird das Register gelesen, so wird die mo-
mentane Rasterzeile (die auf dem Bildschirm
dargestellt wird) ausgelesen. Beim Schreiben
wird der geschriebene Wert in einen internen
Zwischenspeicher uebertragen, der dann zum
Ausloesen eines IRQs verwendet wird.
X-Koordinate der Position des Zeilenstrahls
beim Ausloesen einer negativen Flanke auf dem
Lightpen-Input (die acht hoechstwertigen der
neun Bits).
vie Register 19, aber Y-Koordinate
Sprite Enable. Jedem Sprite ist ein Bit (der
Nummer entsprechend) zugeordnet. Ist das Bit
gesetzt, so ist dieses Sprite aktiviert ("ein-
geschaltet").
65
Register 22:
Register
Register
Register
Register
Register
Register
Register
Register
Register
Register
Register
23:
24:
25;
26
21%
28:
29:
30:
31:
32:
33;
Bits O bis 2 enthalten den Wert der horizonta-
len Verschiebung des Bildschirms in Rasterzei-
len (siehe Scrolling).
Ist Bit 3 geloescht, so werden nur noch 38
Spalten des Bildschirms dargestellt, ansonsten
alle 40 Spalten.
. Bit 4 schaltet (wenn gesetzt) in den Multicolor
Modus um.
Bit 5 ist das Reset-Bit und muss bei der lIlni-
tialisierung geloescht werden, da . ansonsten
keinerlei Operationen von Seiten des
VIC-II-Chips durchgefuehrt werden.
Sprite Y-Expand. Wird ein Bit gesetzt, so wird
das zugehoerige Sprite in doppelter Breite dar-
gestellt.
Bits 1 bis 3 legen die Startadresse des Zei-
chengenerators fest.
Im Bit Map Modus gibt Bit 3 jedoch die Start-
adresse der Bit Map an.
Durch Bit 4 bis 7 wird die Startadresse der Vi-
deomatrix (Bildschirmspeicher) festgelegt.
Interrupt Flag Register:
Bit O0: Rasterregister
Bit 1: MOB-DATA Kollision:
Bit 2: MOB-MOB Kollision
Bit 3: Lightpen
Ist ein Bit gesetzt, so ist die zugehoerige Be-
dingung erfuellt. Wird eine Eins in eine Bitpo-
sition geschrieben, so wird das Bit geloescht.
Bit 7 ist gesetzt,. falls mindestens eins der
Bits von O bis: 3 zusammen mit seinem Enable Bit
gesetzt ist.
Interrupt Enable Register:
Belegung wie oben (Bit 7 unbenutzt). Zugehoeri-
ges Bit gibt an, ob die Interruptquelle einen
IRQ ausloesen kann.
MOB-DATA Prioritaetsregister: Ist das zum
'Sprite gehoerige Bit gesetzt, so besitzt das
Sprite eine niedrigere Prioritaet als der Vor-
deryrund.
MOB-Multicolor: Bei gesetztem Bit wird das zu-
gehoerige Sprite im Multicolor-Modus darge-
stellt.
Sprite X-Expand. Wird ein Bit gesetzt, so wird
das zugehoerige Sprite in doppelter Hoehe dar-
gestellt.
MOB-MOB Collision: zum MOB gehoeriges Bit wird
gesetzt, falls Beruehrung mit anderem MOB er-
folgte.
MOB-DATA Collision: zum MOB gehoeriges Bit wird
gesetzt, falls Beruehrung mit Vordergrunddaten
erfolgte.
Exterior Color (Rahmenfarbe)
Background Color #0 (Standard HNintergrundfarbe)
66
Register 34: Background Color #1 bis Background Color #3,
bis veitere Hintergrundfarben fuer andere Darstel-
Register 36: lungsmodi.
Register 37: enthalten die Farben zur Darstellung von Multi-
Register 38: color Sprites.
Register 39: Jedes Register enthaelt eine Farbe zur Darstel-
bis je eines Sprites (von Nummer 0, Register 39 bis
Register 46: Nummer 7, Register 46).
Bei Farbregistern (Register 32 bis 46) ist jeweils nur das
untere Nybble (Bit O bis Bit 3) benutzt.
Nichtaufgefuehrte Bits sind unbenutzt. Unbenutzte Bits ent-
halten den Wert eins.
Die Farben des VIC-II-Chips
Der Video-Chip verfuegt ueber die Moeglichkeit der Darstel-
lung von sechzehn Farben. Diese Farben werden in Form von
Farbcodes sowohl in den Farbregistern als auch im Color-
Nybble-RAM verwendet. Hier eine Uebersicht ueber alle farben
und wie sie ueber die Tastatur erreicht werden koennen
(PRINT):
Farbcode Farbe Tastatur
0 schwarz Control - 1
1 weiss Control - 2
2 rot Control - 3
3 cyan (tuerkis) Control - 4
4 violett Control - 5
5 gruen Control - 6
6 blau Control - 7
7 gelb Control - 8
8 orange Commodore - ]
9 braun Commodore - 2
10 rosa Commodore - 3
11 hellgrau Commodore - 4
12 mittelgrau Commodore - 5
13 hellgruen Commodore - 6
14 hellblau Commodore - 7
15 dunkelgrau Commodore - B
Ist der Multicolor Modus eingeschaltet (bei Zeichendarstel-
lung), so stehen nur die ersten acht Farben fuer Zeichen zur
Verfuegung.
67
Die
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pinbelegung des VIC-II-Chips (MOS 6567)
- 7:
Datenbus des Prozessors (Bit 6 bis Bit 0)
IRQ/ Ausgang zum Prozessor
Lightpen/ Eingang
CS/ Chip Select, Zugriff auf Register des Chips
R/W Schreib/Leseleitung des Prozessors, O=Write
BA (Bus Available) Freigabe des Prozessorbus'
VDD, Stromversorgung (+12 Volt)
COLOR, Ausgang fuer Farbsignal
SYNC, Ausgang fuer Synchronisationssignale
AEC/, Kontrolle des Systembus' durch VIC
PHO, Ausgang des Prozessortakts
RAS/, Steuersignal fuer dynamische RAMs
CAS/, Steuersignal fuer dynamische RAMs
GND, Masseleitung
PHCL, Eingang der Colorfrequenz
PHIN, Eingang der Dotfrequenz
All, Adressbus des Prozessors
AO bis A5, AB bis Al3, gemultiplexter Adressbus
A6 bis 10, Adressbus des Prozessors
Datenbus fuer Zugriff auf Color Nybble RAM
Datenbus des Prozessors (Bit 7)
VCC, Stromversorgung (+5 Volt)
Fr DÖHNFTGURAT ICH
ER nn
i u 3 b-, ILL
33 DRT
BD I DES
37 PTIOB9
357 0B1G
35 DE11
a4 ala
330777993
32 Ins
os sser LH
Zu Re
&9 m
28 7 IA ALZ
27 Fnsni 1
25 7 JRZrALG
25 AL’R3
24 Ra-R:
FÄAS TDT]18 ER =:
chE 13 22 FHIH
GHO Dee 24 FTIFHCL
SPFEFEITE-EHTLIURFSBILRTT
SANTOS FION- NG
En En DE DD a nt
GLIIIIITITETTIETTTIT TH
OL II TI III T IT TITTTTCTT
Pa | U BE DE GR DR ER DE DR HE DE DR RR DR HR HR
TE Te TI TTTrT
SATIN TAUATIION-U CS
need
IE IR EEE DucG BE DU DR OU DER DR DE DR DR DER N HR DR DE ED
SGANATIO-VO SAU TION-ONG
Rn ee ee a er Tot]
HE Da DE u EEE DER DU HER EN EN ER EN EN
SU TIOL-ONETIN TIIOR- NS
III I IT TUN |
SANATIGNM-ONETOIAITITION- NS
RD DT De aD n/a
SEATTLE FRI TAUNITIANOT- HT
need
69
BEDIENUNG DES SPRITE-GEHERRTORS
Da=z Proaramm "SPRITE GENERRTOR" wandelt nach dem Start durch
"RUN" ein in DATA-Zeilen kefindliches Muster der Groesse var
21 Zeilen mal 24 Spalten in die entsprechenden Dezim=lwerte
fuer die Definition eires Sprites um. Die Dezimalwerte wer-
den automatisch in Proaranmzeilen mit DATA=E umgewandelt, de-
ren erste Zeilennummer durch die Yariakle "L" und der Ak-
stand zwischen dern Zeilen durch "5" beides in Zeile 1)»
festselest werden. Es muss natuerlich darzauf wesachtet wer-
den, dass die neuen Zeilernummern nicht das (rsprungsero-
Sr anım vebkerschreiken. wern nach weitere Sprites kreiert wer—
den sallen.
Die Yariakle "FF" dekenf=lls in Zeile 1) least fest. ck das
Muster als Standard- (F=1) oder Multicclor-Sprite «F=2> auf-
gefasst merden scll. Im Standercdmadus entspricht ein Leer-
zeichen dem Bitwert a und ein Asterisk '"%" einem wesetztenr
Bit. Im Gesensatz dazu werden im Multicolarmodus immer zwei
aufeinander falgende Zeichen behandelt. Sc entsprechen zwei
Blanks dem Bitpazr "aa". "a4" entspricht "al", "++" wird in
"1a" und "#4" in "11" umgewandelt.
sSPEFEITE GEHERRTOR
a REM ##4# SPRITE GENERATOR FÜR THE COMMODORE 84 ###
1 L=199:5=10:F=1:PRINT" UM" :N=. :GOSUBRE :FORI=. TO2a:RERDA$ :FORI=. TOZ:R=.
2 FORK=1TOSSTEPF :B=2%#B#F :C$=MNID$LA$ . T$S+K „FD s IFCH="K" ORCH=" #4" THENB=B+H1
3 B=B-2%0C$=" ++") - IL C$="44") NEXT :P$="" Ss IFRTHENF$=MIDESESTRECRD „25
4 IFPOS«. >+LEN<P$>>P7STHENPRINTCHRE 205 :GOSUBE
S PRINTP3$" ." 3 :NEXT NEST :PRINTCHRS CZ" 3 :POKE19S.N:END
& PRINTMID$S{STR$<LI . 27" DR" 7 :L=L+SsPOKES3S1+N. 13 :N=HN+1 RETURN
1a DATR" FEEEREEN "
11 DATA" FEFTETETETREN z
12 DATA" FETTE TFT vi
13 DATA" VERERRRERTTENTENTENE
14 DATH" Ki ek"
15 DATA" Be OR"
16 DATA" Br"
17 DATA ERREREEEEEEEEREEREEE "'
18. DATA 5
13 DATA KARRIERE “
2a DATA 2
21 DATA BERRRRIEIEE .
22 DATA ERREREEEE “
23 DATA" n
24 DATA" ll =
23 DATA" elek "
26 DATR" Sek .
27 DATR" EEE EC &
28 DATR" EEE 2
29 DATR" KERNE &
38 DATA" RER >
ERDY.
70
ABFRAGE UND BELEGUNG DER FUNKTIONSTASTEN
Sowohl Commodore 64 als auch \IC-20 verfuegen ueber vier
Funktionstasten, die zum Beispiel dıe Erstelluna von Pro-
grammen wesentlich vereinfachen koennen. Auch ermoealichen
sie eine bequeme und uebersichtliche Benutzerfuehrung durch
Anvender- und Spielprogramme. Im folgenden die Erklaerung
der praktischen Ausfuehrung dieser Moeglichkeiten:
Abfrage der Funktionstasten
Die Funktionstasten sind Tasten, deren ASCIIs im Bereich von
133 bis 140 liegen. Dies sind Codes im Bereich der nicht-
druckenden Steuercodes (siehe Tabelle), was Grund dafuer
ist, dass das Druecken dieser Tasten keinerlei Wirkung
zeigt. Lediglich innerhalb von Anfuehrungszeichen (im soge-
nannten Quote-Modus) und nach dem Einfuegen von Leerzeichen
durch "INSERT" (im Insert-Modus) werden Zeichen ausgegeben,
abhaengig vom Darstellungsmodus entweder Balken oder \Vier-
telkreise (im Grafikmodus) oder Buchstaben von "E" bis "L"
(im Kleinschriftmodus), beide Male jedoch in Negativdarstel-
lung. Dieses Verhalten ist aehnlich dem der Tasten zur Cur-
sor- und Farbsteuerung.
Um nun eine gedrueckte Funktionstaste in BASIC-Programmen zu
erkennen, muss entsprechend der Abfrage von anderen Tasten.
vorgegangen werden. Zum Beispiel so, wie im folgenden Pro-
grammausschnitt:
350 PRINT CHR$ (147) "Fl - SEGMENT A"
360 PRINT : PRINT "F3 - SEGMENT B"
370 PRINT : PRINT "BITTE 'Fl' ODER 'F3' DRUECKEN!"
380 GET G$ : IF 6G$ = CHR$ (133) GOTO 500
390 IF G$ C) CHR$ (134) GOTO 380
400 REM SEGMENT B
500 REM SEGMENT A
Hier die Codes der Funktionstasten:
Fl: 133 F3: 134 F5: 135 F7: 136
F2: 137 Fa: 138 F6: 139 F8: 140
Die Codes von 133 bis 136 verden beim Druecken der Funk-
tionstaste alleine erzeugt, die ASCIIs von 137 bis 140 erge-
ben sich beim gemeinsamen Druecken entweder mit einer SHIFT-
Taste oder der COMMODORE-Taste.
Belegung von Funktionstasten
Unterschiedlich dazu ist die Vorgehensweise zum Belegen der
Funktionstasten. Hierbei werden den Tasten bestimmte Texte
oder Befehlsworte zugeordnet, die haeufig benoetigt werden.
Bei Ausuebung dieser Funktion werden die Tasten auch als
"Softkeys" bezeichnet.
Das Belegen ist NUR durch Verwendung eines geeigneten Ma-
schinenprogramms moeglich und NICHT ueber BASIC. Hierzu wird
der Sprungvektor (655/656) geaendert, so dass auf ein eige-
nes Maschinenprogramm verzweigt wird. Dieser Vektor wird in
der Routine SCNKEY verwendet, die die Abfrage der Tastatur
erledigt und normalerweise durch die Interruptroutine aufge-
rufen wird. SCNKEY belegt den Bereich von 60039 bis #HN60N
(siehe ROM-Listing).
71
Bei Erreichen des Sprungvektor (655/656) sind bereits die
Adressen 203 und 653 auf den aktuellen Wert gesetzt worden.
Erstere enthaelt den Tastaturmatrixcode von OD bis 64, (653)
gibt an, welche Kombinationstasten gedrueckt sind (SHIFT,
COMMODORE und CONTROL).
Ist durch das zusaetzliche Maschinenprogramm nun festge-
stellt worden, dass eine Funktionstaste gedrueckt wurde, so
muss nun noch der Zustand der SHIFT-Flag geprueft werden.
Daraus errechnet sich dann, velcher Text im Tastaturpuffer
abgelegt werden soll.
Dies wird durch das im Anschluss abgedruckte BASIC-Programm
erledigt. Es legt das Maschinenprogramm zur Abfrage der
Funktionstasten im Bereich ab Adresse 828 ab, kann jedoch
auch in einen beliebigen anderen Bereich gelegt werden.
Hierzu muss nur die Variable "S" geaendert werden. Der Be-
ginn der Texttabelle wird durch "D" festgelegt. Sie ist in
acht Eintraege zu je zehn Bytes aufgeteilt, entsprechend
"Fl" bis "F8". Die Belegungen koennen durch Aendern der
letzten DATA-Zeile eigenen Anwendungen angepasst werden. Der
Rueckwaertspfeil gibt an, ob die RETURN-Taste gedrueckt wer-
den soll. Die Laenge des Textes darf zehn Buchstaben nicht
ueberschreiten.
Nach Ausfuehrung des Programms durch "RUN" wird die ervei-
terte Tastaturabfrage automatisch aktiviert. Jedoch wird
Vektor (655/656) beim Druecken von "RUNSTOP" und "RESTORE"
wieder auf den Normalwert gesetzt, so dass eine Neuaktivie-
rung notwendig ist. Dies erfolgt durch einen "SYS" mit der
Zahl als Argument, die beim Start des Programms ausgegeben
wurde.
iaa REM ## FUHCTICH KEYS FÜR THE COMMODORE 84 & THE VIC2a ##
11a 5 = 828 ; D= 312 : FOR IT =5 TOS + S3 : RERD R
v
12a POKE I. R =: NE#T : POKE 5 + 74. S - 2565 # INT (S / 256)
13a FPOKE S + 76. S .* 256 : PÜKE S + 4 D .’ 256
i4&@ POKE 5 + 45. DO - 256 # INT iD 2
15a FOR I = a TO 7 : RERD A$ : FOR IT
18a B = ASC KMID$ {A#, I. 125 : IFB
iva FKED + I # 14 + T- 1.B : NEXT
isa IF I <> 11 THEN POKE OD + I #19 + T-1,0
128 NEXT =: FRINT 5 + 73 : SYS S + 73
2aa DATA 184. 203, 1968. 197, 208, il, 44, 259, 255. 16, 3
ia DATA 76, 220. 235, 76. 72, 235. 177, 245. 201. 137, 176
eza DATA 239, 233. 132. 144. 235. 168, 173, 141, 2. 74. 152
23a DATA 42. 133, 197. 18. 18. 1al, 197, 1a, 168, 162, „ 185
e4a DATA „. „ 240, 9, 157. 119. 2, 200. 232. 224, 18, 208
esa DATA 242, 134. 198, 162, 255, 44, 25a, 255. 16. 3, 76
esa DATA 186, 235, 76, 38, 235. 182. „ 160, „ 142, 143, 2
era DATA 14a, 144, 2, 96
sag DATR RUNe.GOTG,LISTr.?FRECBIe,POKE.PEEK« „THEN, INPUT
>
1 TO LEN &R$>
95 THEN RB = 13
72
SOUNDERZEUGUNG MIT DEM COMMODORE 64
Der Commodore 64 besitzt einen hochwertigen Soundbaustein,
den MOS 6581, auch SID (Sound Interface Device) genannt. Mit
diesem lassen sich Geraeusche fast aller Art erzeugen, Mu-
sikstuecke spielen und Soundeffekte zum Beispiel in Spiele
einbauen. Hier eine grobe Funktionsuebersicht:
Der SID verfuegt ueber drei getrennte Soundgeneratoren (die
miteinander synchronisiert oder ringmoduliert werden koen-
nen) mit einem Frequenzbereich von O0 Hz bis ca. 4 kHz. Die
Huellkurve (ADSR) eines jeden Tongenerators kann getrennt
gewaehlt werden, ebenso die Wellenform, von der vier ver-
schiedene (Dreieck, Saegezahn, Rechteck und Rausch) zur Aus-
wahl stehen. Es steht ausserdem ein filter zur Verfuegung,
mit dem die drei Tongeneratoren sowie eine externe Signal-
quelle verfremdet werden koennen. Der dritte Tongenerator
kann ausserdem durch zwei weitere Register kontrolliert ver-
den: Eines gibt die Huellkurve und damit die Amplitude an,
das zweite Register kann zur Modulation der anderen beiden
Soundgeneratoren oder zum Beispiel zur Erzeugung von Zu-
fallszahlen dienen.
Jeder der drei Tongeneratoren kann durch folgende Parameter
gesteuert werden:
Frequenz: Die Frequenz wird durch einen Wert einer Breite
von 16 Bits festgelegt und wird daher durch zwei Register
(je Stimme) bestimmt. Dadurch existieren 65536 verschiedene
Tonhoehen. Die Frequenz errechnet sich dabei wie folgt:
F=-NnN*+c/ 2 t 24
Dabei ist N die 16-Bit-Zahl, C die Systemtaktfrequenz und F
die effektive Frequenz (die letzteren beiden Angaben in
Hertz). Um zum Beispiel einen Ton einer bestimmte Frequenz
erklingen zu lassen, kann prinzipiell folgendermassen vorge-
gangen werden:
14318180 / 14 : IF PEEK (678) THEN C = 17734472 / 18
30C =
310Q=2 24 /C
320?N=F *Q : HI = INT (N / 256) : LO = N - 256 * HI
Wie ersichtlich, sollten hier, wie bei anderen Gelegenheiten
auch, die verschiedenen Taktfrequenzen der verschiedenen Ge-
raete beachtet werden, da die Taktfrequenz nicht exakt ein
MHz betraegt. Die Variablen "LO" und "HI" enthalten nach
Ausfuehrung nun das LSB und MSB fuer die beiden Register zur
Festlegung der Frequenz. Die Frequenz laesst sich in
Schrittweiten von ungefaehr 0.06 Hz festlegen.
ADSR-Funktion: Durch diese aus vier Parametern bestehende
Funktion wird der Lautstaerkeverlauf gesteuert. Der erste
Parameter (A, ATTACK) gibt die Zeitspanne an, in der der Ton
die hoechste Lautstaerke erreicht haben soll. Ist diese
Zeitspanne vorueber, so wird der DECAY-Zyklus eingeleitet.
Durch diesen zweiten Parameter wird die Zeitspanne festge-
legt, in der der Ton auf die durch den Parameter SUSTAIN
festgelegte Lautstaerke zurueckfaellt. Diese Lautstaerke
wird nun solange gehalten, bis durch Loeschen einer bestimm-
ten Flag RELEASE beginnt. Der RELEASE-Parameter gibt, aehn-
lich wie bei DECAY auch, die Zeitspanne an, innerhalb der
der Ton auf die Lautstaerke 0 zurueckgegangen sein soll.
Durch diese Funktion laesst sich der Klang der verschieden-
sten Instrumente imitieren.
73
Graphisch laesst sich diese ADSR-Funktion wie folgt darstel-
len:
ATTACK
Als Zeitspannen von ATTACK, DECAY und RELEASE stehen folgen-
de Moeglichkeiten zur Auswahl:
Wert ATTACK-Spanne DECAY/RELEASE-Spanne
0 0.002 sec 0.006 sec
l 0.008 sec 0.024 sec
2 0.016 sec 0.048 sec
3 0.024 sec 0.072 sec
4 0.038 sec 0.114 sec
5 0.056 sec 0.168 sec
6 0.068 sec 0.204 sec
7 0.08 sec 0.24 sec
8 0.1 sec 0.3 sec
9 0.25 sec 0.75 sec
10 0.500 sec 1.9 sec
11 0.800 sec 2.4 sec
12 1 sec 3 sec
13 3 sec 9 sec
14 5 sec 15 sec
15 8 sec 24 sec
Auch wenn fuer DECAY und RELEASE die gleiche Einteilung vor-
handen ist, so lassen sich diese beiden Parameter natuerlich
unterschiedlich waehlen. Jedoch beziehen sich auch diese An-
gaben wieder auf eine Taktfrequenz von einem MHz. Sollte ei-
ne genaue Angabe der wirklichen Zeitspanne erforderlich
sein, so sind die obigen Werte mit dem faktor ...
l MHz / Systemtaktfrequenz
zu multiplizieren.
Als eine weitere Moeglichkeit der Beeinflussung der einzel-
nen Stimmen steht die Wellenform zur Verfuegung. An Wellen-
formen stehen vier verschiedene zur Auswahl: die Dreieck-
Wellenform, die Saegezahn-Wellenform, die Pulse-Wellenform
sovie die ”"Wellenform" Rausch, die beispielsweise fuer Ex-
plosionen, Wind und Schlagzeug genutzt werden kann.
Dreieck Saegezahn Pulse
ZINN ZN TR)
"Rausch" liefert ein Signal in Form eines Rauschens, dessen
Frequenzen innerhalb eines bestimmten Bereichs liegen.
74
Die Wellenform "Pulse", auch Rechteckschwingung genannt,
kann ausserdem noch durch die Pulsebreite variiert werden.
Dieser Wert mit einer Breite von 12 Bits im Bereich von OD
bis 4095 (die Randverte allerdings bewirken, dass kein Ton
ausgegeben wird) gibt an, wie lange das Signal den Nullpegel
annehmen soll. Ist also ein Wert von 2048 gewaehlt, so er-
haelt man eine exakt regelmaessige Rechteckschwingung. Durch
Aendern der. Pulsebreite (waehrend der Ton erklingt) koennen
klangliche Veraenderungen (ein sogenanntes "Phasing") er-
zeugt werden. Ist eine andere Wellenform als Rechteck ausge-
waehlt, so hat die Angabe einer Pulsebreite keinerlei Aus-
wirkungen auf die Tonerzeugung.
Jede Stimme besitzt sieben Steuerregister (von den insgesamt
29 Registern des SID) zur Kontrolle. Die ersten beiden Regi-
ster eines der drei Bloecke (fuer jeden Oszillator) bestim-
men die Frequenz der Stimme. Dabei handelt es sich um den
unter "Frequenz" beschriebenen 16-Bit-Wert, der in der Rei-
henfolge LSB/MSB in den beiden Registern abgelegt wird.
Die folgenden beiden Register sind fuer die Angabe der
Pulsebreite verwendet. Da diese jedoch nur 12 Bits benoe-
tigt, ist das MSN des zweiten Registers unbenutzt. Das erste
enthaelt die Bits O bis 7, das LSN des zweiten Registers Bit
8 bis Bit 11.
Bei den Registern 4, 11 und 18 (je nach Tongenerator) han-
delt es sich um die Steuerregister fuer den Ablauf der
Huellkurve (darauf wird im folgenden noch eingegangen). Die
Bits 4 bis 7 waehlen die Wellenform aus. Ist ein bestimmtes
Bit gesetzt, so wird die entsprechende Wellenform fuer den
Tongenerator verwendet. Auch ist es moeglich, mehrere Bits
gleichzeitig zu setzen. Allerdings resultiert die dabei ent-
stehende Wellenform aus einer "UND"-Verknuepfung der ausge-
vwaehlten Wellenformen. Hier eine Aufstellung, welches Bit
welche Wellenform auswaehlt (sofern gesetzt):
Bit 4: Triangle (Dreieck)
Bit 5: Sawtooth (Saegezahn)
Bit 6: Pulse (Rechteck)
Bit 7: Noise (Rauschen)
Durch das naechste Register (5, 12, 19) werden die Parameter
ATTACK und DECAY festgelegt. Die Daten fuer ATTACK befinden
sich im MSN, DECAY belegt das LSN. Der Wert kann also
durch ...
POKE 54272 + T*7+5, A* 16 + D
PR abgespeichert werden, wobei 54272 die Basisadresse des
SID ist, T der Tongenerator (von O bis 2) und A und D (je-
veils von O bis 15) die Daten fuer ATTACK und DECAY enthal-
ten.
Das letzte tongeneratorspezifische Register dient zur fest-
legung des SUSTAIN-Levels und der Zeitspanne fuer RELEASE.
Die Laustaerke fuer SUSTAIN befindet sich im MSN, die
RELEASE-Zeitspanne muss im LSN festgelegt werden.
Alle diese Register koennen nur BESCHRIEBEN und NICHT ausge-
lesen werden. Sollen also auf bereits festgelegten Parame-
tern aufbauend andere Effekte erreicht werden, so muessen
die Daten zusaetzlich im RAM abgelegt werden. Die Register
befinden sich an den Adressen 54272 bis 54292.
75
Um nun einen Ton zu erzeugen, muss folgendermassen vorgegan-
gen werden: Zuerst sollten die ADSR-Daten und die Frequenz
(sowie, falls erforderlich, die Pulsebreite) abgespeichert
werden. Ist dies erfolgt, so kann nun, gleichzeitig mit der
Definition der Wellenform, der ADSR-Zyklus begonnen werden.
Dies erfolgt durch Abspeichern eines Wertes in Register-
adresse 54276, 54283 oder 54290 (tongeneratorabhaengig), in
dem Bit O0 gesetzt ist. Bit 4 bis Bit 7 geben die Wellenform
an. Ist der SUSTAIN-Level erreicht worden, so wird dieser so
lange gehalten, wie das Bit O (GATE- oder KEY-Bit genamnt)
gesetzt ist. Wird .es geloescht (die Bitkombonation fuer die
Wellenform muss erhalten bleiben!), so wird RELEASE ausge-
fuehrt. Ist der Nullevel erreicht worden, kann dem Register
der Wert 0 zugewiesen werden. Wird das GATE-Bit geloescht,
bevor DECAY abgeschlossen ist, so wird sofort RELEASE einge-
leitet. Auch wird ATTACK begonnen, falls GATE gesetzt wird,
unabhaengig davon, ob sich dieser Tongenerator vielleicht
noch in der RELEASE-Phase befindet. Das GATE-Bit kann so zum
Beispiel in Abhaengigkeit davon, ob eine bestimmte Taste ge-
drueckt ist, gesetzt und geloescht werden, die Tastatur
wuerde also zu einer Art Klaviatur umfunktioniert.
Um jedoch ein hoerbares Ergebnis zu erzielen, muss die
Hauptlautstaerke festgesetzt werden. Diese kann in 16 Stufen
von O0 (kein Ton) bis 15 (hoechste Lautstaerke) durch das LSN
von Register 24 variiert werden.
Zurueck zum Kontrollregister, mit dem der ADSR-Zyklus ini-
tialisiert und die Wellenform festgelegt wird: Bit 1 dient,
falls gesetzt, zur Synchronisation der Grundfrequenzen ver-
schiedener Oszillatoren. Dazu muss der Oszillator, nach dem
synchronisiert wird, auf eine von null verschiedene Frequenz
gesetzt werden, andere Register dieses Oszillators haben
keinen Einfluss auf die synchronisierte Stimme.
Ein Setzen von Bit 2 bevirkt, falls die Dreieck-Wellenform
des entsprechenden Generators gewaehlt ist, dass der 0szil-
latorausgang dieser Stimme durch ein durch Ringmodulation
(Summe und Differenz der beiden Grundstimmen) kombiniertes
Signal dieses und eines zweiten Generators ersetzt wird.
Auch hier muss der zweite Generator eine von null verschie-
dene Frequenz haben um einen Unterschied zur normalen Ausga-
be zu erzielen.
Bit 3 sperrt den entsprechenden Oszillator und fuehrt
gleichzeitig einen RESET des entsprechenden Oszillators
durch. Dies kann notwendig sein, wenn bei der Auswahl der
Wellenformen NOISE mit einer weiteren Wellenform kombiniert
wurde, da dann der Rauschgenerator blockieren kann.
FILTER
Register 21 und 22 bilden ein Register, das die fFilterfre-
quenz bestimmt. Bit O0 bis 2 von Register 21 (Adresse 54293),
Bit O bis 2 des 11 Bits breiten Werts, sowie alle Bits von
Register 22 (Adresse 54294), Bit 3 bis 10 des Werts, bestim-
men die Filterfrequenz. Diese errechnet sich durch ...
F= (30 + N * 5.81) Hz
Dabei ist N der 11-Bit-Wert und F die fFilterfrequenz in
Hertz. Im Gegensatz zu anderen Werten ist dieser Wert unab-
haengig von der Taktfrequenz. Als Filterarten stehen nun
folgende Moeglichkeiten zur Auswahl: LOWPASS (alle Frequenz-
komponenten des Signals UEBER der Filterfrequenz werden mit
12 dB je Oktave abgeschwaecht), HIGHPASS (entsprechend Lov-
76
pass, jedoch werden alle Frequenzkomponenten des Signals
UNTER der Filterfrequenz mit 12 dB/Oktave abgeschwaecht) so-
wie BANDPASS (alle Frequenzkomponenten UNGLEICH der Filter-
frequenz werden um 6 dB/Oktave vermindert).
Die verschiedenen Ausgabesignale der Filter koennen durch
gleichzeitiges Setzen der entsprechenden Bits additiv ver-
knuepft werden. So kann durch Kombination von Lowpass und
Highpass eine Bandsperre programmiert werden. Der Filter
wird im allgemeinen dazu verwendet, um bestimmte Frequenzen
eines Signals zu eliminieren.
Ausserdem kann die Filterresonanz durch einen Wert von O0
(keine Wirkung) bis 15 (hoechste Resonanz) im MSN von Regi-
ster 23 festgelegt werden. Dies bewirkt eine besondere Beto-
nung der Frequenzkomponenten der filterfrequenz woraus ein
schrillerer Ton resultiert.
Vier verschiedene Stimmen koennen ueber den Filter laufen:
jeder der Oszillatoren ] bis 3 sowie ein externes Signal.
Dieses externe Signal wird durch den Eingang "AUDIO IN" (Pin
5) ueber die Audio/Video-Buchse zum SID geleitet. Soll eine
dieser Stimmen durch den Filter modifiziert werden, so muss
eines der Bits des LSN von Register 23 (Bits 0 bis 2 fuer
Stimme 1 bis 3, Bit 3 fuer das externe Signal) gesetzt wver-
den. Es ist moeglich, mehrere Stimmen gleichzeitig durch den
Filter zu leiten.
TONGENERATOR 3
Stimme 3 (Register 14 bis 20, Adressen 54286 bis 54292)
nimmt eine gesonderte Stellung innerhalb der drei Oszillato-
ren ein. Hier kann der Verlauf der Huellkurve und der Zu-
stand des Oszillators festgestellt werden.
Huellkurve: Die Huellkurve (Register 28) gibt die momentane
Amplitude der ADSR-Funktion an. Ist die durch das LSN von
Register 24 festgelegte Lautstaerke nach Initialisierung des
ADSR-Zyklus' (Setzen des GATE-Bits) erreicht worden (nach
der ATTACK-Phase), so enthaelt dieses Register den Wert 255,
nach RELEASE den Wert OD. So kann zum Beispiel, falls SUSTAIN
eine festgelegte Zeitspanne gehalten verden soll, nach Ab-
lauf dieser Zeitspanne automatisch RELEASE eingeleitet wver-
den. Dazu muss lediglich gewartet werden, bis nach dem Er-
reichen des Werts 255 das Huellkurvenregister den von
SUSTAIN abhaengigen Inhalt hat. Dann wird die gewuenschte
Zeitspanne gewartet, und nach Beendigung der Warteschleife
das GATE-Bit geloescht. Auch kann so erkannt werden, wann
RELEASE beendet ist, um das Kontrollregister (Register 4,
1l, 18 sowie Adressen 54276, 54283, 54290) einer Stimme auf
den Wert null zu setzen, um (sehr schwaches) Nachklingen zu
vermeiden. Auch koennen durch dieses Register sehr winteres-
sante Effekte erzielt werden, wenn in Abhaengigkeit vom Zu-
stand der Huellkurve die Frequenz oder Pulsebreite geaendert
wird. Auch durch Aendern der fFilterfrequenz sind viele wir-
kungsvolle Effekte moeglich.
Oszillator: Dieses Register (#27, Adresse 54299) gibt den
Zustand der acht hoechstvertigen Bits von Oszillator > an.
Der Registerinhalt aendert sich je nach gewaehlter Wellen-
form. Bei der Wellenform "Dreieck" nimmt der Inhalt des
Registers gleichmaessig von OD bis 255 zu. Ist der Wert 255
erreicht worden, so wird dieser Wert nun wieder bis auf null
vermindert, woraufhin wieder von vorne begonnen wird. "Sae-
gezahn" laesst den Inhalt dieses Registers auch von 0 bis
255 ansteigen, faellt nach Erreichen dieses Werts jedoch so-
77
fort wieder auf null zurueck. Ein staendiger Wechsel von O0
auf 255 (und zurueck) wird bei "Pulse" ausgefuehrt. Die
Laenge dieser beiden Phasen ist vom Pulsebreitenregister ab-
haengig. Bei "Noise" koennen "zufaellige" Werte im Bereich
von O0 bis 255 ausgelesen werden. Die Hauptanwendung dieses
Register besteht, wie beim vorherigen Register auch, Echt-
zeit-Effekte auszufuehren (was natuerlich im Normalfall nur
von Maschinensprache aus moeglich ist), wobei die Parameter
anderer Oszillatoren durch Werte, die durch Oszillator 3 er-
zeugt wurden, geaendert werden.
Viele Effekte, die auf von Oszillator 3 errechneten Daten
aufbauen, benoetigen diese Stimme jedoch ueberhaupt nicht.
Daher ist es moeglich, Stimme 3 abzuschalten, ohne jedoch
die internen Vorgaenge zu beeinflussen. Das Signal von Ton-
generator 3 erscheint so also nicht am Audio-Ausgang des
SID-Chips. Jedoch bleiben Synchronisation und Ringmodulation
davon unbetroffen, da diese kombinierten Signale davon unab-
haengig sind, ob Oszillator 3 ein- oder ausgeschaltet ist.
Das Ausschalten von Stimme 3 erfolgt durch Setzen des MSB in
Register 24 (Adresse 54296).
Die AD-Wandler
Der SID verfuegt ausserdem ueber zwei AD-Wandler (POTX und
POTY, Adressen 54297 und 54298), die es ermoeglichen, Poten-
tiometerzustaende zu erkennen. Die in den Registern befind-
lichen Werte - sie werden alle 512 Taktzyklen auf den neue-
sten Wert gebracht - koennen im Bereich von 0 (niedrigster
Widerstand) bis 255 (hoechster Widerstand) liegen.
Beim Commodore 64 finden diese beiden Eingaenge des SID im
Normalfall fuer die Paddles Verwendung, jedoch auch eine
Verwendung als Temperaturfuehler oder Helligkeitsmesser wae-
re nicht abwegig.
Registeruebersicht (die Basisadresse des SID ist 54272):
Register 0: LSB der Frequenz des Oszillators von Stimme 1
Register 1: MSB der Frequenz des Oszillators von Stimme 1
Register 2: niederwertigsten acht Bits des Pulsebreitenre-
gisters (Stimme 1) fuer die Erzeugung von
Rechtecksignalen
Register 3: das LSN dieses Registers bildet die Bits 8 bis
ll des Pulsebreitenregisters (Stimme 1), das
MSN ist unbenutzt
Register 4: Kontrollregister fuer Stimme |]
Bit DO: GATE, Stimme 1
wird dieses Bit gesetzt, so wird der
durch die ADSR-Parameter gewaehlte Ab-
lauf der Huellkurve begonnen. Innerhalb
der durch ATTACK festgelegten Zeitspanne
steigt die Lautstaerke bis auf den Maxi-
malwert (durch LSN in Register 24 fest-
gelegt), um dann die RELEASE-Phase zu
beginnen, in der die Lautstaerke auf den
durch SUSTAIN festgelegten Pegel zu-
rueckfaellt. Dieser wird so lange gehal-
ten, bis das GATE-Bit wieder rueckge-
setzt wird. Im gleichen Augenblick be-
ginnt SID RELEASE und laesst dadurch den
Ton bis auf Nullpegel zurueckfallen.
78
Register
Register
Register
Register
Register
Register
Register
5:
6:
Bit 1: SYNC
Eine Synchronisation von Stimme |] mit
Stimme 3 erfolgt durch Setzen dieses
Bits.
Bit 2: RING MOD
Eine Ringmodulation von Stimme |] mit
Stimme 3 erfolgt durch Setzen dieses
Bits.
Bit 3: TEST
Wird dieses Bit gesetzt, so wird Stimme
l gesperrt und gleichzeitig ein Reset
des Oszillators durchgefuehrt, wodurch
eine eventuelle (durch Kombination von
"Rausch" mit einer weiteren Wellenform)
Blockade des Rauschgenerators aufgehoben
vird.
Bit 4: Auswahl der Dreieckswellenform
(TRIANGLE), falls Bit gesetzt
Bit 5: Auswahl der Saegezahnwellenform
(SAWTOOTH), falls Bit gesetzt
Bit 6: Auswahl der Wellenform PULSE, falls Bit
gesetzt
Bit 7: Auswahl der "Wellenform" NDOISE, falls
Bit gesetzt
ATTACK/DECAY
Bits 4 bis 7 (ATTACK) geben die Dauer (von 2
msec bis 8 sec) an, die SID benoetigt, bis die
Maximallautstaerke vom Nullpegel aus erreicht
werden soll.
Bits O0 bis 3 (DECAY) definieren die Zeitspanne
(von 6 msec bis 24 sec), in der die Lautstaerke
vom Maximalwert (nach ATTACK) auf SUSTAIN zu-
rueekgeht.
SUSTAIN/RELEASE
Bits 4 bis 7 (SUSTAIN): Lautstaerkepegel, auf
den bei DECAY zurueckgegangen wird. Dieser
Level wird gehalten, bis GATE rueckgesetzt
wird.
Bits 0O bis 3 (RELEASE): Zeitspanne, in der der
Lautstaerkepegel von SUSTAIN wieder auf null
zurueckgeht. Der Bereich erstreckt sich, wie
bei DECAY auch, von 6 msec bis 24 sec.
Diese sieben Register haben die gleiche Funk-
tion, wie die ersten sieben Register auch, je-
doch fuer Stimme 2. Ringmodulation und Synchro-
nisation erfolgen mit Stimme ].
Diese sieben Register haben die gleiche Funk-
tion, wie die ersten sieben Register auch, je-
doch fuer Stimme 3. Ringmodulation und Synchro-
nisation erfolgen mit Stimme 2.
FILTER LO ;
Die niedervwertigster drei Bits bilden Bit O bis
Bit 2 der Filterfrequenz (fuer alle Tongenera-
toren identisch). Vebrige Bits sind ungenutzt.
79
Register 22: FILTER HI
Dieses Byte bildet zusammen mit Bits 0 bis 2
von Register 21 die Filterfrequenz. Diese gibt
die Eck- beziehungsweise Zentralfrequenz des
Filters an.
Register 23: das MSN gibt die Resonanz im Bereich von 0 bis
15 an. Dadurch werden die Frequenzkomponenten
im Bereich der fFilterfrequenz besonders hervor-
gehoben.
Bit O0: leitet Stimme ] ueber den Filter (falls
Bit gesetzt)
Bit l: leitet Stimme 2 ueber den Filter (falls
Bit gesetzt)
Bit 2: leitet Stimme 3 ueber den Filter (falls
Bit gesetzt)
Bit 3: leitet externes Signal ueber den Filter
* (falls Bit gesetzt)
Register 24: LSN: globale Maximallautstaerke von 0 (ausge-
schaltet) bis 15 (hoechste Lautstaerke)
Bit 4: LOWPASS des Filters einschalten
Bit 5: BANDPASS des Filters einschalten
Bit 6: HIGHPASS des Filters einschalten
(Kombination ist, wie beschrieben, moeglich)
Bit 7: schaltet Stimme 3 aus, falls Bit ge-
setzt. Dadurch kann Stimme 3 zur reinen Daten-
gewinnung durch Register 27 und 28 verwendet
verden.
Auf all diese Register (#0 bis #24) kann NUR SCHREIBEND zu-
gegriffen werden. Ein Auslesen ist nicht moeglich, da immer
der Wert null ausgelesen wird.
Die folgenden vier Register dahingegen koennen nur - ausgele-
sen werden, ein schreibender Zugriff hat keinerlei Ausvir-
kungen:
Register 25: POTX, digitaler Wert des ersten A/D-Wandlers
Register 26: POTY, digitaler Wert des zweiten A/D-Wandlers
Register 27: der Registerinhalt gibt den momentanen Zustand
des Oszillators 3 an und dient meist zur Erzeu-
gung von speziellen Effekten.
Register 28: hiermit kann der Verlauf der Huellkurve von
Stimme 3 verfolgt werden. Je nach Zustand kann
hier ein Wert im Bereich von 0 (niedrigste
Lautstaerke) bis 255 (hoechste Lautstaerke)
ausgelesen werden.
Um einen Ton der gleichschwebend temperierten Skala (zum
Beispiel beim Klavier) zu erzeugen, hier noch ein kurzes
Beispielprogramm:
100 B = 54272 : K = 77 * 2 $ 21.25 / 715909
110 IF PEEK (678) THEN K = 495 * 2 ? 20.25 / 2216809
120 POKE B + 5, O : POKE B + 6, 240 : POKE B + 24, 15
130 FOR I = 0 T0 94 : n = Int (2t (1 / 12) *K + .5)
140 H = INT (N / 256) : POKE-B, N - 256 * H : POKE B + 1, H
150 POKE B + 4, 17 : FOR J = 0 TO 99 : NEXT : POKEB +4, 0
160 NEXT : POKEB+4,0
Die Pinbelegung des SID (MOS 6581)
Pin
l
2:
13:
CAPAA, CAP1B: Anschluss fuer Kondensator, der
durch den Filter benoetigt wird. Die Kapazitaet
des angeschlossenen Kondensators betraegt beim
Commodore 64 2200 pF
CAPZA, CAP2B: Kondensatoranschluss fuer Filter;
siehe Pin 1 und 2
RES/, setzt SID in Grundzustand, alle internen
Register werden auf null gesetzt
PH2, Systemtaktfrequenz fuer Buskontrolle
R/W, Schreib/Leseleitung des Prozessors
CS/, Chip-Select, steuert Zugriff auf Register
des SID 6581
AO bis A4, Steuerleitungen zur Auswahl der
Register des SID, die drei letzten Register
sind unbenutzt und haben keine Bedeutung
GND, Masseleitung
DO bis D7, Datenbus zum Transfer von Daten vom
und zum Prozessor
Analogeingaenge (POTY, POTX) fuer Paddles
VCC, Versorgungsspannung (+5 Volt)
EXT IN, Eingang fuer externes Audio-Signal, das
durch den Filter des SID geleitet werden soll
AUDIO OUT, Ausgang aller im SID erzeugten
Signale sowie EXT IN
VDD, Versorgungsspannung (+12 Volt)
PIN CONFIGURATIOH
CAFIR 1 u 28 „DE:
CAPIE 2 ar AUGICG CUT
CAPZA 2 ze EXT IHN
CAPZE J 2s CC
RE= Ss 4 FOT=
PHE 12 ea POT
Ru ae ee ee CT
cs g us BSel oe
ra 3 2 DS
Ri a 1
1
1
l
1
1021 Ba DER Ba 1 EN a Bu u BZ
2
&
£ aM»
DD
nz
[=
|
|
|
81
DER SERIELLE BUS DES COMMODORE 64
Der Commodore 64 verfuegt ueber einen seriellen Bus, an den
mehrere Peripheriegeraete angeschlossen werden koennen. Die-
ser uebertraegt, im Gegensatz zum IEEE-488-Bus der Geraete
der CBM-Serie, die Daten seriell (aehnlich der RS-232-
Schnittstelle) zwischen Computer und Peripheriegeraet. Die
Bedienung des Ports von Maschinensprache aus erfolgt aber
ueber Routinen, die von der Funktion her identisch mit denen
der CBMs sind. Diese Routinen lassen sind in zwei Gruppen
einteilen: Die erste Gruppe bedient die Peripheriegeraete
ueber ein Filehandling. Es wird jedem Kanal eine fFilenummer
zugeordnet (es koennen mehrere Files gleichzeitig geoeffnet
- aber nicht aktiv - sein), ein Zugriff erfolgt dann unter
Angabe einer Filenummer. Dieses Prinzip entspricht ziemlich
genau den BASIC-Befehlen fuer das Arbeiten mit Files: OPEN,
CLOSE, PRINT#, INPUT# und GET#. So ist es zum Beispiel durch
Aendern der Geraetenummer auch moeglich, eine Ausgabe auf
den Bildschirm anstelle einer Ausgabe auf den Drucker zu er-
reichen.
Die zweite Gruppe von Routinen erfordert ein wesentlich
sorgfaeltigeres Arbeiten, da man direkt ueber den seriellen
Bus arbeitet. Daher koennen ueber diese Routinen (normaler-
veise) auch nur Geraetenummern im Bereich von 4 bis 15 ver-
wendet werden. Ein Programm, das ueber diese Routinen zum
Beispiel auf die Diskettenstation zugreift, kann nicht (vie
beim Arbeiten ueber logische Files) durch Aendern der Gerae-
tenummer fuer Recorder umgeschrieben werden. Auch kann zu
einem Zeitpunkt nur ein Kanal geoeffnet sein, durch den auf
den seriellen Bus zugegriffen wird.
Hier nun die genaue Vorgehensweise, um einen Kanal fuer den
seriellen Bus zu bedienen. Es werden die Kommandos mit den
Bezeichnungen versehen, wie sie auch in der Sprungtabelle
fuer die Systemroutinen (siehe dort) verwendet worden sind.
Um ein Kommando auszufuehren, muss der entsprechende Eintrag
in der Sprungtabelle durch "JSR" oder "JMP" aufgerufen wver-
den.
Der erste Befehl dient zur Festlegung, ob das Geraet am se-
riellen Bus Daten SENDEN oder EMPFANGEN soll. Entsprechend
ist das erste Kommando entweder "TALK" oder "LISTEN", der
Accu muss beim Aufruf einer dieser Routinen die Geraetenum-
mer enthalten. Die naechste Routine dient zur Ausgabe der
Sekundaeradresse, die im Normalfall der Festlegung des AT-
beitsmodus' des Geraets dient. Je nachdem, ob die erste Rou-
tine "TALK" oder "LISTEN" war, wird als zweite Routine
"TKSA" oder "SECOND" verwendet. Der Accu enthaelt hier die
Sekundaeradresse, die die Bits O0 bis 3 belegt. Die Bits 4
bis 7 dienen weiterhin der Festlegung, ob ein Kanal (inner-
halb des Peripheriegeraets) geoeffnet, geschlossen oder auf
einen geoeffneten Kanal zugegriffen werden soll. Beim
Schliessen eines Kanals sind die Bits 5 bis 7 gesetzt, beim
Zugriff auf einen geoeffneten Kanal sind die Bits 5 und 6
gesetzt, beim Eroeffnen eines Kanals sind alle Bits des MSN
gesetzt. Die Ausgabe der Sekundaeradresse beendet automa-
tisch den Kontrollmodus.
Die Ausgabe eines Filenamens kann nach der Neuanmeldung ei-
nes Kanals erfolgen, ist jedoch nicht unbedingt erforder-
lich. Jedes Byte des Filenamens wird dann ueber "CIOUT"
(Zeichencode im Accu) zeichenveise ausgegeben. Ist die Aus-
gabe beendet, so muss die Routine "UNLSN" aufgerufen werden,
da die Uebertragung des Filenamens schliesslich abgeschlos-
sen ist. Auf diesen Kanal kann nun unter Angabe der gleichen
82
Sekundaeradresse wieder zugegriffen werden, was besonders
beim Arbeiten mit Diskette wichtig ist. Auch die Ausgabe ei-
nes CLOSE-Kommandos auf ein Peripheriegeraets hat - wie das
BOPEN-Kommando auch - ueber "LISTEN", "SECOND" und "UNLSN" zu
erfolgen.
Wurde das Geraet durch gesetztes Bit 5 und Bit 6 in der Se-
kundaeradresse angesprochen, so koennen nun durch "ACPTR"
und "CIOUT" Daten empfangen und gesendet werden. Die Ueber-
gabe der Parameter erfolgt jeweils ueber den Accu. Sind alle
Daten uebertragen worden (beim Empfang durch die EOI-Kenn-
zeichnung zu erkennen, jedoch nicht unbedingt bei Geraeten,
die nicht von Commodore stammen), wird auch hier der Ab-
schluss des Zugriffs durch "UNLSN" oder "UNTLK" (je nachdem)
dem Peripheriegeraet mitgeteilt.
Als Beispiel soll hier das Einlesen des Disketteninhaltsver-
zeichnisses dienen, das beim Commodore 64 normalerweise
ueber 'LOAD "$", 8' und 'LIST' ausgegeben werden muss. Beim
folgenden Beispielprogramm wird nun aber nicht mehr das Pro-
gramm, dass sich im Arbeitsspeicher befindet, weberschrie-
ben, da das Inhaltsverzeichnis bei Aufruf der Routine direkt
ausgegeben wird. Zum besseren Verstaendnis sollte der Aufbau
von BASIC-Programmen (Ablage im Arbeitsspeicher) bekannt
sein.
LDA #0
STA STATUS ;Statusvariable 'ST' loeschen
LDA #8 sGeraetenummer fuer Diskettenstation
JSR LISTEN ; LISTEN auf Bus ausgeben
LDA #%11110000 ;sSekundaeradresse fuer OPEN Kanal OD
JSR SECOND sKanal in Diskettenstation eintragen
LDA #"$ ;sZeichen fuer Filenamen
JSR CIOUT ;Filenamen auf Bus ausgeben
JSR UNLSN sUNLISTEN auf Bus ausgeben
LDA #8 sGeraetenummer fuer Diskettenstation
JSR TALK ;TALK auf Bus ausgeben
LDA #%01100000 ;Zugriff auf Kanal O der Floppy
JSR TKSA ;Sekunaderadresse nach TALK ausgeben
LDX #5 ;‚Zaehlwert fuer Schleife
.BY 44 ;Code fuer BIT-Befehl
START LDX #3 ;Zaehlwert fuer Schleife
LOOP JSR GETBYT ;sZeichen holen, Status pruefen
DEX
BNE LOOP ;Schleife ausfuehren
TAX ;Filelaenge (LSB) in XR uebertragen
JSR 43735 ;sCRLF auf Bildschirm ausgeben
JSR GETBYT ;MSB der Anzahl an Bloecken holen
JSR 48589 ;Ausgabe der Anzahl an Bloecken
LOOP2Z JSR GETBYT ;Zeichen holen, Status pruefen
TAX ;Statusflags setzen
BEQ START ;Nullcode? Zeilenende erkannt
JSR CHROUT ;Ausgabe Zeichen auf den Bildschirm
BNE LOOP2 ;Unbedingter Sprung
GETBYT JSR ACPTR ;Zeichen von seriellem Bus holen
LDY STATUS ;Statusvariable 'ST' pruefen
BNE STOP ;Statusbit im Status gesetzt?
RTS ;Nein: Rueckkehr zum Hauptprogramm
STOP PLA ;Ruecksprungadresse vom Stack holen
PLA
JSR UNTLK ;Zugriff auf Kanal beenden
LDA #8 sGeraetenummer fuer Diskettenstation
JSR LISTEN ;LISTEN auf Bus ausgeben
LDA #%11100000 ;Sekundaeradresse fuer CLOSE Kanal O0
JSR SECOND ;Kanaleintrag loeschen
JMP UNLSN ;sUNLISTEN auf Bus ausgeben
84
Soll dieses Programm ab der Adresse 828 abgelegt werden, so
kann dies durch folgendes Programm geschehen (da das Pro-
gramm dann im Bereich des Cassettenpuffers liegt, wird es
natuerlich durch Recorderoperationen ueberschrieben):
100 FOR I = 828 TO 917 : READ A : POKE I, A : NEXT
110 DATA 169, , 133, 144, 169, 8, 32, 177, 255, 169, 240, 32
120 DATA 147, 255, 169, 36, 32, 168, 255, 32, 174, 255, 169
130 DATA 8, 32, 180, 255, 169, 96, 32, 150, 255, 162, 5, 44
140 DATA 162, 3, 32, 124, 3, 202, 208, 250, 170, 32, 215
150 DATA 170, 32, 124, 3, 32, 205, 189, 32, 124, 3, 170, 240
160 DATA 232, 32, 210, 255, 208, 245, 32, 165, 255, 164, 144
170 DATA 208, 1, 96, 104, 104, 32, 171, 255, 169, 8, 32, 177
180 DATA 255, 169, 224, 32, 147, 255, 76, 174, 255
Durch Anhaengen der Programmzeile ...
190 POKE 874, 202 : POKE 879, 221
kann das Programm auf dem WVIC-20 betrieben werden (siehe
Adressumrechnung fuer VIC-20), da bei diesem das Arbeiten
mit dem seriellen Bus in der gleichen Weise erfolgt, wie bei
Commodore 64 auch.
85
DATENTRANSFER UEBER DIE RS-232-SCHNITTSTELLE
Im Betriebssystem des Commodore 64 ist die Geraetenummer
zwei der Bedienung der RS-232-Schnittstelle vorbehalten.
Dies ist die Bezeichnung fuer einen Standard der seriellen
Datenuebertragung und ist aehnlich der europaeischen V.24-
Norm. Bei der seriellen Uebertragung wird nicht, wie dies
zum Beispiel beim IEEE-488-Bus der Fall ist, ein Byte auf
einmal, sondern Bit fuer Bit jede Informationseinheit ge-
trennt uebergeben. Daraus resultiert natuerlich eine langsa-
mere Vebertragungsrate als bei paralleler Uebertragung, da-
fuer werden aber wesentlich weniger Datenleitungen benoe-
tigt. Ein Anwendungsfall fuer eine serielle Uebertragung
vaere zum Beispiel der Datenaustausch ueber Telefon.
Zu den bereits im Commodore 64 enthaltenen Routinen fuer die
Bedienung der RS-232-Schnittstelle wird nur noch ein Steck-
modul benoetigt, das auf den Userport gesteckt wird und die
Schnittstelle selbst darstellt, die dann vom Betriebssystem
bedient wird. Nun ist es Ihnen mit dem Commodore 64 zum Bei-
spiel auch moeglich, Peripheriegeraete mit RS-232-Schnitt-
stelle zu verwenden.
Wird beim Commodore 64 ein File mit der Geraetenummer zwei
eroeffnet, so werden automatisch zwei Pufferbereiche (first
in, first out) einer Laenge von je einer Page festgelegt,
die fuer den Empfang und fuer das Senden von Daten verwendet
werden. Dieser durch den OPEN-Befehl reservierte Bereich von
512 Bytes wird am Ende des BASIC-Arbeitsspeichers angelegt.
Nach Anlegen des RS-232-Pufferbereichs wird zusaetzlich ein
"CLR" durchgefuehrt, so dass das Oeffnen eines RS-232-Kanals
zu Beginn eines Programms durchgefuehrt werden sollte. Es
kann immer nur ein RS-232-Kanal auf einmal geoeffnet sein,
da durch ein zweites OPEN mit der Geraetenummer zwei die
Pointer in die Puffer zurueckgesetzt werden und so bereits
empfangene Daten oder noch nicht gesendete Daten verloren
gehen. Auch das Schliessen eines RS-232-Kanals, das auch
gleichzeitig die 512 Bytes wieder freigibt, beinhaltet ein
"CLR" 5
Achtung! Ist zum Zeitpunkt des Deffnens des RS-232-Kanals
das Programm (ohne Variablen) so lang, dass keine 512 Bytes
mehr frei sind, so wird wohl, ohne dass ein Fehler gemeldet
werden wird, eine Zerstoerung des Programms die Folge sein.
Saemtliche BASIC-Befehle zur Filebehandlung koennen auch bei
Benutzung der RS-232-Schnittstelle Verwendung finden. Das
gleichzeitige Empfangen und Senden von Daten ist, sofern
spezifiziert, moeglich. Ansonsten geschieht dies nacheinan-
der.
Die Parameter zur Uebertragung werden durch den Filenamen
(erstes Byte (Kontrollregister) und zweites Byte (Kommando-
register)) festgelegt. Das dritte und vierte Byte werden nur
dann benoetigt, falls eine durch den Benutzer festlegbare
Vebertragungsrate spezifiziert werden soll. Wird kein File-
name angegeben, so werden die Daten des letzten DPEN-Befehls
verwendet.
Das Kontrollregister bestimmt die Uebertragungsrate (Baud-
Rate), die Laenge eines Datenworts (fuenf bis acht Bits) und
die Anzahl an Stoppbits, die nach der Vebertragung der Da-
tenbits (vor der Uebertragung des Startbits fuer die negati-
ve Flanke) gesendet werden.
Durch das Kommandoregister werden der Handshake-Modus und
die Art der UVebertragung des Paritybits festgelegt. Ausser-
dem wird angegeben, ob Vollduplex oder Halbduplex erwuenscht
ist.
Die einzelnen Bits des Kontrollregisters sind folgenderma-
ssen organisiert: Bit O bis Bis 3 geben die Baud-Rate an,
Bit 5 und 6 bestimmen die Wortlaenge und Bit 7 ist fuer die
Anzahl an Stoppbits zustaendig. Bit 4 ist unbenutzt. Im fol-
genden eine Uebersicht:
Bit 3 21 0 dez Baud-Rate
0000 0 User Rate siehe Beschreibung
0007] l 50 Baud
0071 0 2 75 Baud
oo 171 3 110 Baud
0100 4 134.5 Baud
0 107]1 5 150 Baud
01210 6 300 Baud
oı 7171 7 600 Baud
10 0 0 8 1200 Baud
100 \]1 9 1800 Baud
10710 10 2400 Baud
10.1 ]1 11 3600 Baud nicht implementiert
11000 12 4800 Baud nicht implementiert
i: 2: 20:1 13 7200 Baud nicht implementiert
112100 14 9600 Baud nicht implementiert
r. 4. 10 >41 15 19200 Baud nicht implementiert
Bit 6 5 dez Wortlaenge
0 0 0 8 Bits
0 1 32 7 Bits
1 0 64 6 Bits
1 1 96 5 Bits
Bit 7 dez Stoppbits
0 0 1 Stoppbit
l 128 2 Stoppbits
Durch das Kommandoregister wird durch Bit 0 der Handshake-
Modus festgelegt, Bit 4 legt die Art des Duplex fest und Bit
5 bis 7 sind fuer die Parity-Uebertragung notwendig. Die
restlichen Bits (1, 2, 3) sind unbenutzt. Auch hier eine
Uebersicht:
Bit OD dez Handshake
0 0 3-Line-Handshake
l 1 X-Line-Handshake
Bit 4 dez Duplex
0 0 Vollduplex
l 16 Halbduplex
Bit 765 dez Parity-Uebertragung
0 0 weder Pruefung, noch Uebertragung
1 32 ungerade Parity
1 96 gerade Parity
1
l
.u.O0O
-O-0 \
160 keine Pruefung, Vebertragung Bitvwert 1
224 keine Pruefung, Vebertragung Bitwert 0
87
Hierzu ein praktisches Beispiel:
Es soll ein RS-232-Kanal mit folgenden Parametern eroeffnet
werden:
VUebertragungrate: 110 Baud
Wortlaenge: 8 Bits
Anzahl Stoppbits: 2 Stoppbits
Handshake: 3-Line-Interface
Duplex: Halbduplex
Parity: Ungerade Parity
Das Eroeffnen koennte nun folgendermassen vorgenommen ver-
den:
OPEN 1, 2, O0, CHR$(128+0+3) + CHR$(32+16+0)
Die weiteren zwei Zeichen werden nicht benoetigt, da keine
eigene Uebertragungsgeschvwindigkeit spezifiziert wurde.
Werden Wortlaengen unter acht Bits verwendet, so enthalten
unbenutzte Bits den Wert null.
Die Uebernahme von Zeichen sollte durch den GET#-Befehl er-
folgen, da bei einem Fehler waehrend einer Uebernahme durch
INPUT# (CTS- oder DSR-Missing) sich das System aufhaengt und
nur durch RESTORE zurueckgeholt werden kann. Bei Empfang des
Null-Zeichens CHR$(0) wird der Leerstring uebernomnmen.
Bei der Vebergabe eines Wagenruecklaufs an einen Drucker
wird nicht gevartet, bis der Drucker wieder bereit ist, Da-
ten zu empfangen (falls der Drucker keine interne Pufferung
besitzt). Daher sollte, falls der Drucker diese Moeglichkeit
besitzt, X-Line-Interface verwendet werden, da hier die zu
uebergebenden Zeichen solange in einem Puffer zwischenge-
speichert werden, bis der Drucker durch die CTS-Leitung vie-
der angibt, empfangsbereit zu sein.
Beim Schliessen eines RS-232-Kanals wird jeglicher Daten-
transfer abgebrochen und saemtliche Ausgaenge werden auf
high gesetzt.
Wird der RS-232-Status gelesen, so wird dieser automatisch
geloescht, so dass bei mehreren Abfragen der Wert der Sta-
tusvariablen einer anderen Variablen uwebergeben werden muss.
Der RS-232-Status wird nur dann gelesen, falls die letzte
Datentransferoperation die RS-232-Schnittstelle betraf. Die
Bits des Statusregisters haben bei der Verwendung des
RS-232-Kanals folgende Bedeutungen:
Bit dez Bedeutung
1 Parityfehler
2 Framingfehler
4 Empfangspuffer ueberlaufen
8 Empfangspuffer leer (Zeichen ungueltig)
16 CTS (Clear To Send) Signal fehlt
32 unbenutzt
64 DSR (Data Set Ready) Signal fehlt
128 Abbruch erkannt
SOAVFUuUNMO
Ist Bit 2 gesetzt, so sollten mehr als 256 Zeichen im Emp-
fangspuffer zwischengespeichert werden. Der Pufferzeiger
wurde zurueckgesetzt. Die Zeichen sind verlorengegangen.
Wird versucht ein Zeichen zu lesen, waehrend der Empfangs-
puffer leer ist, so wird Bit 3 gesetzt.
88
Dıe Spezifizierung von eigenen Uebertragungsraten ist moeg-
lich. Hierbei sollte jedoch beachtet werden, dass auf diese
Weise nicht die vom Betriebssystem auferlegte obere Grenze
von 2400 Baud ueberwunden werden kann, da durch die Taktfre-
quenz hoehere Geschwindigkeiten nicht mehr verarbeitet ver-
den koennen.
Zum besseren Verstaendnis bei der Errechnung eigener Baud-
Raten sollte das Betriebssystemlisting im Bereich von 62499
bis 62540 herangezogen werden. Ausserdem wird die Kenntnis
des Sprungvektors in Adresse 65409 (siehe Beschreibung der
Systemroutinen) empfohlen.
Ein Programmanfang, der einen RS-232-Kanal mit den im Bei-
spiel spezifizierten Parametern eroeffnet, aber stattdessen
eine Vebertragungsrate von 200 Baud (Variable B) definiert,
koennte folgendermassen aussehen:
100 F=14318180/14:IF PEEK(678) THEN F=17734472/18
110 B=200:T=INT(F/B/2-99.5):H=INT(T/256):1L=T-256*H
120 OPEN 1,2,0,CHR$(128+0+0)+CHR$( 32+16+0)+CHR$CL)+CHR$(H)
Allerdings sollte beachtet werden, dass dies keinerlei Stan-
dards entspricht. Das obige Programmsegment kann jedoch dann
vervendet werden, wenn Sender und Empfaenger auf die Baud-
Raten eingerichtet sind.
Zum Abschluss noch eine Tabelle der beim RS-232-Handling
verwendeten, RS-232-spezifischen Adressen in der Zeropage,
Page 2 und im I/O-Bereich der NMI-CIA:
167 : Zwischenspeicher fuer empfangenes Bit
168 : Bitzaehler fuer den Empfang von Bytes
169 : Flag fuer Empfang des Startbits
170 : serielles Shift-Register fuer Empfang von Daten
171 : Register zur Errechnung der Parity beim Empfang
180 : Bitzaehler fuer die Ausgabe von Bytes
181 : naechstes zu sendendes Bit (Bit 2)
182 : serielles Shift-Register fuer Ausgabe von Daten
189 : Register zur Bestimmung der Parity bei der Ausgabe
247/248: Zeiger auf Beginn des Empfangspuffers;
gueltig, falls Highbyte ungleich null
249/250: Zeiger auf Beginn des Sendepuffers;
gqueltig, falls Highbyte ungleich null
659 : Kontrollregister (siehe Beschreibung)
660 : Kommandoregister (siehe Beschreibung)
661/662: Wert fuer Baud-Rate aus Tabelle
663 : RS-232-Statusbyte
664 : Wortlaenge (Berechnung bei OPEN)
665/666: Wert fuer Timer beim Senden
667 : Zeiger auf Ende des Empfangspuffers
(letztes Zeichen + ])
668 : Zeiger auf Zeichen im RS-232-Empfangspuffer
(naechstes Zeichen bei GET)
669 : Zeiger auf zu uebertragendes Byte
670 : Zeiger auf naechste freie Stelle im Sendepuffer
673 : Flagregister fuer aktive NMIs (Datenuebertragung)
Bit 0 ist beim Senden von Daten gesetzt; Bit 1 und
Bit 4 werden beim Empfang benoetigt, Bit 1 fuer
Timeout-TimerB und Bit 4 fuer die Erkennung des
Startbits beim Uebergang vom high des Stoppbits zum
low des Startbits.
89
Verwendete Adressen der NMI-CIA:
56576 : Port A, siehe unten
56577 : Port B, siehe unten
56580/56581: TimerA, Baud-Rate fuer Ausgabe von Daten
56582/56583: TimerB, Baud-Rate fuer Empfang von Daten
56589 : ICR, Festsetzung der aktiven NMIs,
Feststellung der NMI-Quelle
56590 : CRA, Festlegung des TimerA Arbeitsmodus'
56591 : CRB, Festlegung des TimerB Arbeitsmodus'
Belegung des User-Ports in Verbindung mit den CIA-Ports:
Pin 6526 Beschreibung Richtung
A - GND : Protective Ground -
B FLAG Sin : Received Data (fuer Startbit) IN
C PBO Sin : Received Data, RS-232 IN IN
D PBl RTS : Request To Send OUT
E PB2 DTR : Data Terminal Ready DUT
F PB3 RI : Ring Indicator IN
H PB4 DCD : Data Carrier Detect IN
J PB5 unbenutzt IN
K PB6 CT5S : Clear To Send IN
L PB7 DSR : Data Set Ready IN
M PA2 Sout: Transmitted Data, RS-232 OUT DUT
N - GND : Signal Ground _
DER 1/0 BAUSTEIN MOS 6526 (CIA) DES COMMODORE 64
Zwei 1/0-Bausteine des Typs 6526 besitzt der Commodore 64.
Durch sie wird der Kontakt vom Computer zur Aussenwelt ge-
schaffen. Die Tastaturabfrage, die Erkennung von Signalen
auf Cassette, die Kommunikation ueber den seriellen Bus oder
die RS-232-Schnittstelle, all dies und noch einiges mehr ist
erst durch diese beiden Bausteine moeglich, deren Funktionen
hier dargelegt werden sollen.
Zuerst eine allgemeine Beschreibung, die fuer beide CIAs
(Complex Interface Adapter) gilt. Auf die Unterschiede zvi-
schen den beiden Bausteinen, die nur in deren Verwendung
beim Commodore 64 liegen, wird im Anschluss eingegangen.
Eine kurze Uebersicht: Dieser Baustein verfuegt ueber 16
einzeln programmierbare Portleitungen sovie ueber zugehoeri-
ge Kontrolleitungen, die fuer Handshaking verwendet werden
koennen, zwei kombinierbare 16-Bit-Timer und ein B-Bit-
Shiftregister fuer serielle Datenuebertragungen. Ausserdem
existiert eine interne 24-Stunden-Uhr mit programmierbarer
Alarmzeit.
Die Steuerung all dieser Moeglichkeiten erfolgt ueber sech-
zehn Register, die verschiedene Funktionen erfuellen. Vier
dieser Register dienen der Programmierung der
PORTS DER CIA
Die CIA besitzt zwei Ports zu je einer Breite von acht Bits.
Jede Portleitung der beiden Ports (Port A und Port B ge-
nannt) kann unabhaengig als Eingang oder Ausgang geschaltet
werden. Dies geschieht ueber die Datenrichtungsregister der
CIA. Entsprechend den beiden Ports existieren zwei Daten-
richtungsregister mit den Bezeichnungen "DDRA" und "DDRB"
(Data Direction Register). Jedes Bit eines Datenrichtungsre-
gisters gehoert entsprechend zu einem Bit eines der beiden
Register, in denen dann der Zustand der Portleitung geaen-
dert oder geprueft werden kann. Diese beiden Register hei-
ssen "PRA" und "PRB" (Peripheral Data Register).
Um eine Portleitung als EINGANG zu kennzeichnen, muss das
zugehoerige Bit im Datenrichtungsregister GELDOESCHT werden.
Entsprechend ist das Bit im Datenrichtungsregister zu SET-
ZEN, wenn die Portleitung als AUSGANG verwendet werden soll.
Die Datenrichtungsregister befinden sich an den Adressen 2
(DDRA) und 3 (DDRB) relativ zur Basisadresse des Bausteins.
Die Ports nehmen die Adressen O (PRA) und 1 (PRB) ein. Die
Nummern der Portleitungen (PAO bis PA7, PBO bis PB7) ent-
sprechen den Nummern der Bits der zugehoerigen Steuerregi-
ster. PB6 und PB7 werden auch im Zusammenhang mit den Timern
verwendet.
Die Vebergabe von Daten zwischen zwei CIAs (oder aehnlichen
Bausteinen) kann unter Kontrolle der Leitungen PC und FLAG
erfolgen. So wird PC fuer die Dauer eines Taktes auf Low-Pe-
gel gelegt, wenn auf PRB lesend oder schreibend zugegriffen
wurde. Dieses Signal kann verwendet verden, um zu zeigen,
dass die Daten (die von anderer Stelle auf den Port B gege-
ben wurden) vom Computer gelesen worden (DATA ACCEPTED)
sind. Andererseits kann dadurch auch erkannt werden, dass
neue Daten vorliegen und gelesen werden koennen (DATA
VALID). Dies kann durch die FLAG-Leitung festgestellt wer-
den. Sie erkennt negative Flanken (Wechsel von high nach
low) und gibt diese Information in Form einer gesetzen Flag
91
in einem Register der CIA weiter. Ausserdem kann zusaetzlich
ein Interrupt ausgeloest werden. Sollen also Daten zwischen
zwei Computern durch deren CIAs ausgetauscht werden, so ge-
nuegt es, die PC-Leitung der einen CIA mit der FLAG-Leitung
der anderen CIA (und umgekehrt) zu verbinden (natuerlich zu-
saetzlich zu Portleitungen von Port B).
DER SERIELLE PORT
Der Serielle Port besteht aus einem Shiftregister, das mit
Daten einer Breite von acht Bits arbeitet. Dieses Shiftregi-
ster kann sowohl als Eingang, als auch als Ausgang program-
miert werden. Dies geschieht durch Bit 6 von CRA. Ist dieses
Bit geloescht, so fungiert der serielle Port als Eingang,
ansonsten als Ausgang (gleiche Spezifikation, wie bei den
Datenrichtungsregistern auch). Als Leitungen fuer die Ueber-
gabe von Daten durch den seriellen Port dienen die Pins SP
und CNT. Dabei werden die Daten auf SP wuebertragen, die
Steuerung erfolgt durch CNT. Ist das Shiftregister auf Ein-
gang geschaltet, so wird im Falle einer positiven Flanke auf
CNT der am Eingang SP befindliche Wert in das Shiftregister
geschoben. Ist dies achtmal geschehen, so wird der Wert des
Shiftregisters in das Serial Data Register (SDR) uebertra-
gen. Gleichzeitig wird (sofern zugelassen) ein Interrupt ge-
neriert, woraufhin dann die gelesenen Daten durch den Compu-
ter verarbeitet werden koennen. Im Ausgabemodus wird die Ge-
schwindigkeit, mit der die Daten aus dem Shiftregister auf
den seriellen Port ausgegeben werden, durch Timer A spezifi-
ziert. Dabei betraegt die Baudrate die halbe Underflow-Rate
von Timer A. Die hoechste Uebertragungsrate waere demnach
ein Viertel des Systemtakts, was jedoch in der Praxis kaum
erreicht werden kann, da die Daten schliesslich vom Empfaen-
ger auch noch verarbeitet werden muessen. Sind Daten ins SDR
geschrieben worden, so beginnt die Uebertragung der Daten
(sofern Timer A laeuft und sich im Continuous Mode befin-
det). Am CNT-Pin erscheint nun die aus Timer A abgeleitete
Frequenz, die Daten werden aus dem Shiftregister (auf SP)
geschoben, waehrend eine positive Flanke auf CNT ausgegeben
wird. Dabei wird das MSB des seriellen Ports zuerst heraus-
geschoben (eingehende Daten sollten das gleiche Format auf-
weisen, da sie ansonsten erst umgewandelt werden muessen).
Sind alle acht Bits uebertragen worden, wird (ebenso wie
beim Empfang von Daten) ein Interrupt ausgeloest, der dem
Programm mitteilt, dass weitere Daten uwebertragen werden
koennen. Dies geschieht nicht, wenn bereits vor der Ueber-
tragung des achten Bits neue Daten ins SDR geschrieben wur-
den. In diesem Fall wuerde die Uebertragung direkt fortge-
setzt.
DIE TIMER
Jeder der beiden Timer der CIA besteht aus einem Vorspeicher
(Latch) und Zaehler (Counter) mit einer Breite von je sech-
zehn Bits. Wird in die zu einem Timer gehoerigen Register
GESCHRIEBEN, so wird dieser Wert automatisch ins Latch
uebertragen. Beim LESEN dagegen erscheint immer der momenta-
ne Zaehlervert. Die beiden Timer koennen unabhaengig vonein-
ander benutzt werden, es besteht jedoch auch die Moeglich-
keit, sie miteinander zu verbinden. Weiterhin bestehen meh-
rere verschiedene Modi, die es erlauben, lange Verzoege-
Tungsschleifen zu programmieren oder zum Beispiel spezielle
Wellenformen mit unterschiedlich langen Impulslaengen zu ge-
nerieren. Das Lesen des Counters und Schreiben des Latch er-
folgt fuer Timer A ueber die Register 4 (low) und 5 (high),
Timer B wird ueber die Register 6 und 7 (ebenfalls low und
high) programmiert.
92
Die Kontrolle des Arbeitsmodus' der beiden Timer erfolgt
ueber ihnen zugeordnete (voneinander unabhaengige) Kontroll-
register (CRA und CRB, Register 14 und 15), deren Bits fol-
gende Bedeutungen haben:
Bit O0: START/STOP
Durch das Loeschen dieses Bit kann ein Timer jederzeit ange-
halten oder durch das Setzen dieses Bits gestartet werden.
Bit 1: PB ON/OFF
Sollen Signale unter Kontrolle eines Timers an einem Port
erzeugt werden, so kann dies durch dieses Bit gesteuert ver-
den. Bei jedem Timeout wird der zum Timer gehoerige Port
(PB6 fuer Timer A, PB7 fuer Timer B) entsprechend den Anga-
ben in Bit 2 beeinflusst (sofern Bit 1 gesetzt ist! Ist es
geloescht, so hat der Timer keinerlei Einfluss auf die Port-
leitung). Diese Funktion hat eine hoehere Prioritaet als die
Funktionszuveisung von PB6 und PB7 im DDRB. Ist dieses Bit
also gesetzt, so fungiert dieser Port ohne Ruecksicht auf
den Wert im DDRB als Ausgang.
Bit 2: TOGGLE/PULSE
Dieses Bit gibt an, in welcher Weise die zum Timer gehoerige
Portleitung beim Timeout des Timers arbeiten soll. Ist das
Bit geloescht, so wird bei jedem Timeout auf der zugehoeri-
gen Portleitung ein positives Signal der Laenge eines Takt-
zyklus gegeben. Die zweite Moeglichkeit ist, durch diesen
Port Rechtecksignale bestimmter Frequenz auszugeben. Ist
dieses Bit naemlich gesetzt, so wird bei jedem Timer-Under-
flow das Signal an diesem Port invertiert. Die Frequenz die-
ses Signals entspricht dadurch (wie beim Arbeiten mit dem
Seriellen Port auch) der halben Underflow-Rate des Timers.
Beide Modi jedoch arbeiten nur dann, wenn Bit 1 auch gesetzt
ist.
Dieser Modus ist uebrigens identisch mit dem des "OUTPUT EN-
ABLE" durch Setzen von Bit 7 im ACR der VIA 6522, wodurch
ueber PB7 Rechtecksignale ausgegeben werden koennen, deren
Frequenz durch Timer 1 festgelegt wurde.
Bit 3: ONE-SHOT/CONTINUOUS
Im One-Shot-Modus (Bit gesetzt) zaehlt der Counter vom ge-
speicherten Wert bis auf den Wert '0' herunter, erzeugt ei-
nen Interrupt, laedt den Timer neu mit dem im Latch befind-
lichen Wert und stoppt dann. Im Continuous Mode stoppt der
Timer nicht, sondern beginnt dann diese Prozedur von vorne.
Bit 4: FORCE LOAD
Wird in dieses Bit der Wert ']' geschrieben, so wird der
Counter des Timers, unabhaengig davon, ob er gerade laeuft
oder nicht, mit dem im Latch befindlichen Wert geladen. Beim
Lesen ist dieses Bit immer geloescht. Das Schreiben einer
'0' hat keinerlei Wirkung.
Ein Counter wird ausserdem automatisch immer dann mit dem
Wert des Latch geladen, falls ein Underflow auftritt oder
(nur wenn der Timer momentan gestoppt ist) wenn in das High-
byte des Timers geschrieben wird. Werden also neue Latchver-
te gespeichert, so braucht kein FORCE LOAD zu erfolgen, wenn
diese Werte in der Reihenfolge low/high gespeichert werden.
93
Die folgenden Bits sind fuer CRA und CRB unterschiedlich be-
legt und bieten fuer die verschiedenen Timer verschiedene
Moeglichkeiten, welches die Quelle fuer das Herabzaehlen des
Timers sein soll.
CRA, Bit 5: IN MODE
Ist dieses Bit geloescht, so wird Timer A mit der Frequenz
des Systemtakts herabgezaehlt. Bei gesetztem Bit 5 wird Tim-
er A bei jedem positiven Impuls auf CNT um den Wert ']' ver-
mindert.
CRB, Bit 5 und Bit 6: IN MODE
Fuer Timer B existieren zu den beiden Modi von Timer A (die
fuer Timer B bei geloeschtem Bit 6 Gueltigkeit haben) noch
zwei weitere Taktquellen: Bei der ersten (Bit 6 gesetzt, Bit
5 geloescht) wird Timer B bei jedem Underflow von Timer A
herabgezaehlt. Dadurch ist es moeglich, beide Timer zu einem
Timer mit einer Breite von 32 Bits zu kombinieren. Als wvei-
terer Arbeitsmodus bietet sich die Moeglichkeit, Timer B nur
dann die Underflow-Impulse von Timer A zaehlen zu lassen,
venn waehrenddessen CNT auf High-Pegel liegt.
TIME OF DAY CLOCK
Die CIA verfuegt ueber eine 24-Stunden-Echtzeituhr mit einer
Aufloesung von einer Zehntelsekunde. Zusaetzlich besteht die
Moeglichkeit, eine Alarmzeit festzulegen. Ist diese Alarm-
zeit durch die Uhr erreicht worden, so wird ein Interrupt
ausgeloest. Die Uhr ist in vier Register aufgeteilt: ein
Stundenregister, dessen MSB die Flag fuer AM/PM darstellt,
ein Minuten- und Sekundenregister sovie ein weiteres Regis-
ter fuer die Zehntelsekunden. Die Zahlendarstellung in all
diesen Registern erfolgt im gepackten BCD-Format, wodurch
eine Umwandlung der Daten in den Registern durch Maschinen-
programmen vereinfacht (und beschleunigt) wird.
Die Uhr wird ueber die Netzfrequenz getaktet, wodurch eine
recht hohe Genauigkeit gewaehrleistet ist. Es werden Netz-
frequenzen von 50 und 60 Hertz (einstellbar) verarbeitet.
Die Einstellung erfolgt durch Bit 7 des CRA (geloescht = 60
Hz, gesetzt = 50 Hz).
Die Alarmzeit wird durch die gleichen Register wie die nor-
male Zeit auch festgesetzt. Die Unterscheidung erfolgt durch
Bit 7 des CRB. Ist es gesetzt, so werden die in die Register
8 bis 11 (Zehntelsekunden bis Stunden) geschriebenen Daten
als Alarmzeit aufgefasst. Ist es geloescht, so kann die nor-
male Uhrzeit festgelegt werden. Das Lesen der Register , gibt
immer die Uhrzeit an. Die Alarmzeit kann daher nicht gelesen
verden.
Soll die Uhrzeit gelesen werden, so werden beim Lesen des
Stundenregisters automatisch saemtliche Register fuer die
Uhrzeit in ein Latch uebertragen, sodass waehrend des Lesens
keinerlei Vebertrag auftreten kann. Es kann nun also die
Uhrzeit zum Zeitpunkt, zu dem das Stundenregister gelesen
wurde, verarbeitet werden - es treten keinerlei Uebertrags-
probleme mehr auf. Die Uhr "steht" nun scheinbar, laeuft in-
tern jedoch weiter. Ist zum Abschluss das Register fuer die
Zehntelsekunden gelesen worden, so erscheint die Uhrzeit nun
wieder direkt in den Registern, es erfolgt keinerlei Zwi-
schenspeicherung mehr. Natuerlich ist es moeglich, einzelne
Register zu lesen, ohne dass eine Zwischenspeicherung er-
folgt. Schliesslich tritt beim Lesen von einzelnen Registern
94
nicht mehr das Problem des Uebertrags auf. Soll jedoch das
Stundenregister alleine gelesen werden, so muss anschlie-
ssend das Register fuer Zehntelsekunden gelesen werden, um
das Latchen wieder aufzuheben.
Aehnlich erfolgt dies beim Setzen der Uhrzeit. Sobald in das
Stundenregister geschrieben wurde, wird die Uhr sofort ge-
stoppt. Sie laeuft erst dann wieder an, wenn das Register
fuer Zehntelsekunden gesetzt wurde. Dadurch wird erreicht,
dass die Uhr auch wirklich erst zu dem Zeitpunkt anfaengt zu
laufen, der durch die neuen Werte festgelegt wurde.
INTERRUPT HANDLING
Bei einer CIA existieren fuenf Moeglichkeiten des Inter-
rupts, die einzeln kontrolliert werden koennen. Dazu dient
das Register 13. Durch dieses wird festgelegt, ob durch eine
Interruptquelle auch die Interruptleitung des Prozessors auf
low gelegt werden soll. Es ist also moeglich, jeden einzel-
nen Interrupt getrennt zu sperren oder freizugeben. Ausser-
dem kann, unabhaengig davon, ob der Interrupt zugelassen ist
oder nicht, durch Lesen von Register 13 festgestellt werden,
ob das geforderte Ereignis fuer einen Interrupt aufgetreten
ist. Es kann jedoch nicht der Zustand des Interrupt Enable
Registers festgestellt werden. Daher kann es notwendig sein,
ein weiteres Register im RAM zu verwenden, um aktive Inter-
rupts zu merken (dies wird beim RS-232-Handling gemacht).
Hier die Belegung des Registers:
Bit O0: Underflow von TIMER A
Bit 1: Underflow von TIMER B
Bit. 2: TIME OF DAY CLOCK = ALARM
Bit 3: Shiftregister voll/leer (je nach Modus)
Bit 4: negative Flanke auf FLAG
Beim Lesen von Register 13 sind im gelesenen Wert nun saenmt-
liche Bits gesetzt, fuer die die Bedingung eines Interrupts
erfuellt ist (Bit 5 bis Bit 7 sind unbenutzt). Beim Lesen
dieses Registers werden ausserdem saemtliche Bits rueckge-
setzt, sodass der gelesene Wert bei mehrfacher Verwendung
zwischengespeichert werden muss.
Soll ein Interrupt (oder mehrere) GESPERRT werden, so muss
ein Wert in Register 13 geschrieben werden, in dem saemtli-
che Bits gesetzt sind, deren entsprechende Interruptquellen
gesperrt werden sollen. Soll ein Interrupt FREIGEGEBEN wver-
den, so muss zusaetzlich Bit 7 in diesem Wert gesetzt sein.
Bit 7 fungiert also als Flag dafuer, ob ein Interrupt ge-
sperrt oder freigegeben werden soll.
Registeruebersicht:
Register 0: PRA (Port Register A)
Dient zur Feststellung der Zustaende von Port A
(Eingang) und zum Aendern derselben (Ausgang).
Register 1: PRB (Port Register B)
Dient zur Feststellung der Zustaende von Port B
(Eingang) und zum Aendern derselben (Ausgang).
Register 2: DDRA (Data Direction Register A)
Festlegung der einzelnen Portleitungen von Port
A als Eingang (Bit geloescht) oder Ausgang (Bit
gesetzt).
95
Register 3:
Register 4
Register 5:
Register 6:
Register 7:
Register 8:
Register 9:
Register 10:
DDRB (Data Direction Register B)
Festlegung der einzelnen Portleitungen von Port
B als Eingang (Bit geloescht) oder Ausgang (Bit
gesetzt).
TA LO (Timer A Low Order Byte)
Beim LESEN dieses Registers wird der momentane
Wert des Counters (LSB) von Timer A zurueckge-
geben.
Ein SCHREIBENder Zugriff setzt das LSB des
Latch von Timer A fest.
TA HI (Timer A High Order Byte)
Beim LESEN dieses Registers wird der momentane
Wert des Counters (MSB) von Timer A zurueckge-
geben.
Ein SCHREIBENDER Zugriff setzt das MSB des
Latch von Timer A fest. Ausserdem wird, sofern
Timer A gestoppt ist, der Wert des Latch in den
Counter uebertragen.
TB LO (Timer B Low Order Byte)
Die Funktion dieses Registers entspricht der
des Registers 4, jedoch fuer Timer B.
TB HI (Timer B High Order Byte)
Die Funktion dieses Registers entspricht der
des Registers 5, jedoch fuer Timer B.
TOD 10THS (10ths of Seconds Register)
LESEN: Zehntelsekunden der internen Uhr im BCD-
Format, gleichzeitiges Aufheben einer durch das
Lesen des Stundenregisters hervorgerufenen Zvi-
schenspeicherung.
SCREIBEN: Festlegung der Zehntelsekunden der
internen Uhr sowie gleichzeitiges Starten der
Uhr (falls MSB von CRB gesetzt), ansonsten
Festsetzung der Zehntelsekunden der Alarmzeit.
Bit 4 bis Bit 7 sind unbenutzt.
TOD SEC (Seconds Register)
LESEN: Sekunden der internen Uhr im BCD Format.
SCREIBEN: Festlegung der Sekunden der internen
Uhr (falls MSB von CRB gesetzt), ansonsten
Festsetzung der Sekunden der Alarmzeit.
Bit O bis Bit 3 enthalten die Einerstelle, Bit
4 bis 6 die Zehnerstelle der Sekunden. Bit 7
ist unbenutzt.
TOD MIN (Minutes Register)
Funktion und Belegung entsprechend Register 9,
jedoch fuer die Minuten.
96
Register ll:
Register 12:
Register 13:
Register 14:
TOD HR (Hours + AM/PM Register)
Bit O bis Bit 3: Einerstelle der Stunden
Bit 4 : Zehnerstelle der Stunden
Bit 5 und Bit 6: unbenutzt
Bit 7 : AM (=0) und PM (=1) Flag
LESEN: Stunden und AM/PM-Flag der internen Uhr,
gleichzeitig wird die Uhrzeit in ein internes
Latch uebertragen, damit es nicht zu Ueberlauf-
problemen kommt. Die Zwischenspeicherung wird
durch Lesen von Register 8 aufgehoben.
SCREIBEN: Festlegung der Stunden (und AM/PM)
der internen Uhr sovie gleichzeitiges Stoppen
der Uhr (falls MSB von CRB gesetzt), ansonsten
Festsetzung der Stunden (und AM/PM) der Alarm-
zeit.
SDR (Serial Data Register)
Dieses Register dient dazu, die Daten fuer den
Seriellen Port festzulegen (WRITE) oder gelese-
ne Daten zu uebernehmen (READ).
ICR (Interrupt Control Register)
LESEN (Interrupt DATA): Feststellung, ob Inter-
Tupts aufgetreten sind (Bit gesetzt). Bit 7 ist
gesetzt, wenn mindestens ein Interrupt freige-
geben und die Bedingung fuer diesen Interrupt
gegeben ist. Saemtliche Bits werden geloescht,
wenn dieses Register gelesen wurde.
SCHREIBEN (Interrupt MASK): Jegliche Inter-
rupts, deren zugehoerige Bits gesetzt sind,
verden, falls Bit 7 des geschriebenen Wertes
gleich eins ist (MASK Bit wird gesetzt), frei-
gegeben. Ist Bit 7 geloescht, so wird dieser
Interrupt gesperrt (MASK Bit wird geloescht).
Die Interrupts, deren korrespondierende Bits im
geschriebenen Wert geloescht sind, bleiben un-
beeinflusst.
Bit O0: Underflow von Timer A
Bit 1: Underflow von Timer B
Bit 2: interne Uhr hat Alarmzeit erreicht
Bit 3: Shiftregister voll/leer (Input/Output)
Bit 4: negative Flanke auf FLAG
Bit 5 und Bit 6 sind unbenutzt.
CRA (Control Register A)
Bit O: START
Ist dieses Bit gesetzt, so laeuft Timer
A momentan, ansonsten ist er gestoppt.
Durch Setzen dieses Bits kann Timer A
gestartet werden, beim Loeschen wird
Timer A sofort angehalten.
Bit 1: PB ON
Ist dieses Bit gesetzt, so wird ein Un-
derflow von Timer A auf die im naechsten
Bit gekennzeichnete Weise auf PB6 sicht-
bar gemacht. Ist Bit 1 geloescht, so hat
Timer A keinerlei Einfluss auf PB6.
Bit 2: OUT MODE
Bei gesetztem Bit (TOGGLE) wird bei je-
dem Underflow von Timer A das Signal auf
PB6 invertiert. Ist es geloescht
(PULSE), so wird bei einem Underflow ein
positiver Impuls fuer die Dauer eines
Systemtakts ausgegeben.
97
Bit 3: RUN MODE
Durch Setzen dieses Bits wird bevirkt,
dass Timer A, nachdem er vom gelatchten
Wert auf null zurueckgezaehlt hat, an-
haelt (Counter wird neu geladen). Ist es
geloescht, so wird fortlaufend vom
Startwert auf null zurueckgezaehlt.
Bit 4: LOAD
Durch Setzen dieses Bit wird ein Laden
des Counters mit dem im Latch gespei-
cherten Wert erzwungen. Beim Lesen ist
dieses Bit jedoch immer geloescht.
Bit 5: IN MODE
Timer A zaehlt die Impulse des System-
takts, wenn dieses Bit geloescht ist,
bei gesetztem Bit zaehlt Timer A die
positiven Impulse auf CNT.
Bit 6: SP MODE
Dieses Bit schaltet den Seriellen Port
auf Eingang (=0) oder Ausgang (=1]).
Bit 7: TOD IN
Die Einstellung der zu verarbeitenden
Netzfrequenz fuer die interne Uhr er-
folgt ueber dieses Bit. 50 Hz werden
verarbeitet, wenn dieses Bit gesetzt
ist, ansonsten werden 60 Hz am TOD-Pin
erwartet.
Register 15: CRB (Control Register B)
Die Bits O bis 4 entsprechen in der Funktion
denen des Registers CRA, jedoch fuer Timer B
und PB7.
Bit 5 und Bit 6: IN MODE
Ist Bit 6 geloescht, so entspricht der Zaehlmo-
dus von Timer B der in Bit 5 festgelegten Weise
(entsprechend der Bedeutung von IN MODE in
CRA). Ist Bit 6 gesetzt, so zaehlt Timer B die
Underflows von Timer A (Bit 5 geloescht) oder
nur dann die Underflows von Timer A, wenn CNT
auf high liegt (Bit 5 gesetzt).
Bit 7: ALARM
Das Setzen dieses Bits bewirkt, dass beim
schreibenden Zugriff auf die Register 8 bis 11
nicht die normale Uhrzeit (wie dies der Fall
ist, wenn dieses Bit geloescht ist) gesetzt
wird, sondern die Alarmzeit, die jedoch nicht
ausgelesen werden kann.
DIE VERWENDUNG DER CIAs IM COMMODORE 64
Die Register der beiden CIAs belegen im Commodore 64 den Be-
Teich von 56320 bis 56335 (CIA #1) sowie den Bereich von
56576 bis 56591 (CIA #2). Einer der Hauptunterschiede zwi-
schen den beiden CIAs besteht darin, dass die Interrupt-Lei-
tung der CIA #1 mit der IRQ-Leitung des Prozessors verbunden
ist. Ist also eine der Interruptquellen der CIA freigegeben,
so kann sie beim Prozessor einen IRQ ausloesen. Dahingegen
ist die zweite CIA mit der NMI-Leitung verbunden. Sie wird
zum Ausloesen der Interrupts fuer das RS-232-Handling ver-
vendet, da dieses (aus Gesehwindigkeitsgruenden) "parallel"
zu allen anderen Aktivitaeten des Prozessors abgewickelt
werden muss und daher ‚die hoechste Prioritaet bekommt. Daher
verden die beiden CIAs auch nach diesen Verbindungen zur CPU
bezeichnet: IRQ-CIA fuer CIA #1, NMI-CIA fuer CIA #2. Die
Register sind in. der normalen Reihenfolge von O bis 15 ange-
ordnet.
98
Hier die genaue Verwendung der einzelnen Moeglichkeiten der
beiden CIAs im Commodore 64:
IRQ-CIA (CIA #1):
Die beiden Ports dienen der Abfrage der Joysticks, Tastatur
und der Auswahl der Paddles:
Port A: Jedes der acht Bits kann eine Reihe der Tastatur zur
Dekodierung anwaehlen, wenn das entsprechende Bit geloescht
ist.
Bit 0 bis Bit 4 dienen ausserdem der Abfrage von Controlport
2, Bit 6 und Bit 7 der Auswahl des Paddlepaares (siehe Er-
klaerung von Paddle und Joystick).
Port B: Dieser Port dient der Spaltenrueckmeldung der ausge-
waehlten Tastaturreihe fuer die Tastaturdekodierung. Eine
Taste der ausgewaehlten Reihe ist gedrueckt, wenn das ent-
sprechende Bit geloescht ist. Bits O0 bis 4 werden auch hier
zur Joystickabfrage (Controlport 1) verwendet.
Timer A wird zur Erzeugung des "normalen" IRQs alle 60stel
Sekunden benutzt. Ist ein Underflow aufgetreten, so wird un-,_
ter anderem die Tastatur abgefragt, die softwaremaessig rea-
lisierte Uhr (nicht die CIA-Uhr!) weitergestellt und anderes
erledigt. Ausserdem wird dieser Timer fuer das Lesen von
Cassette benoetigt.
Timer B wird nur bei Cassettenoperationen (beim Schreiben
zur Festlegung der Impulslaengen, beim Lesen zur Feststel-
lung der Impulsabstaende) sowie bei der Benutzung des seri-
ellen Bus' (fuer Wartezeiten) verwendet und sollte daher
fuer eigene Programme problemlos verwendet werden koennen.
Die eingebaute Echtzeituhr wird (zusammen mit Timer A) vom
Betriebssystem nur gelesen, um daraus Zufallszahlen bei
"RND(O)" zu generieren. Dies sollte jedoch andere Progranm-
me, die die Echtzeituhr benutzen, nicht beeinflussen.
Der Serielle Port ist, wie das Pin CNT auch, vollkommen un-
benutzt und ist fuer eigene Anwendungen an den User-Port
herausgefuehrt.
Der FLAG-Eingang wird zum Lesen von Cassette und als
SRQ-Eingang (Service .ReQuest) am seriellen Bus verwendet.
NMI-CIA (CIA #2):
Die beiden Ports werden hauptsaechlich fuer Datenuebertra-
gung genutzt:
Port A: Bit O und Bit 1 dienen zur Festlegung der Video-Bank
fuer den VIC-II-Chip (hoechstvertige Adressbits VAl4 und
VAl5). Bit 2 wird fuer die Datenausgabe der RS-232-Uebertra-
gung verwendet. Die uebrigen Bits dienen dem Austausch von
Daten ueber den seriellen Bus:
Bit 3: ATN OUT (Attention-Leitung)
Bit 4: CLOCK OUT (Taktleitung Ausgang)
Bit 5: SERIAL OUT (Datenleitung Ausgang)
Bit 6: CLOCK IN (Taktleitung Eingang)
Bit 7: SERIAL IN (Datenleitung Eingang)
Port B ist vollstaendig an den Userport " herausgefuehrt und
im Normalfall unbenutzt. Allerdings erhalten die Portleitun-
gen von Port B (mit Ausnahme von PB5) eine Bedeutung im Zu-
99 -.
sammenhang mit der RS-232-Schnittstelle, die auf den User-
port aufgesteckt wird. Die Bedeutungen der Leitungen sind im
Zusammenhang mit der Erklaerung des RS-232-Handlings erlaeu-
tert.
Timer A wird beim Senden von Daten ueber die RS-232-Schnitt-
stelle verwendet und ist ansonsten unbenutzt.
Timer B wird beim Empfangen von Daten ueber die RS-232-
Schnittstelle verwendet und ist ansonsten unbenutzt.
Die eingebaute Echtzeituhr wird in keiner Weise vom Be-
triebssystem angesprochen und steht vollkommen frei fuer ei-
gene Anwendungen.
Wie bei der IRQ-CIA auch, so ist auch hier der Serielle Port
vollkommen unbenutzt und ist fuer eigene Anwendungen an den
User-Port (SP und CNT) herausgefuehrt.
FLAG und PC zum Uebertragen von Daten mittels Handshaking
sind (ausser beim RS-232-Handling, hier wird FLAG zur Erken-
nung des Startbits herangezogen) unbenutzt und stehen am
Userport frei zur Verfuegung.
PINBELEGUNG DER CIA
Pin 1 : GND, Masseleitung
Pin 2 - 9: bidirektionale Portleitungen PAD bis PA7
Pin 10 - 17: bidirektionale Portleitungen PBO bis PB7
Pin 18 : PC/, Handshakeleitung fuer Port B, Ausgang
Pin 19 : TOD, Eingang Netzfrequenz fuer "Time of Day"
Pin 20 : VCC, Betriebsspannung von +5 Volt
Pin 21 : IRQ/, Interruptleitung zum Prozessor (NMI, IRQ)
Pin 22 : R/W, Eingang Schreib/Leseleitung des Prozessors
Pin 23 : CS/, Kennzeichnung Zugriff auf CIA-Register
Pin 24 : FLAG/, Handshakeleitung fuer Port B, Eingang
Pin 25 : PH2, Systemtakt 2 fuer Prozessorbussteuerung
Pin 26 - 33: DB7 bis DBO, Datenbus des Prozessors
Pin 34 : RES/, Ruecksetzen der CIA in Ausgangszustand
Pin 35 - 38: RS3 bis RSO, Registerauswahl bei CS/=0
Pin 39 : SP serieller Port, Eingang oder Ausgang von SDR
Pin 40 : CNT, Steuerleitung zu SDR oder fuer Timer
GNE! 1 un {u
PRAG 2 Be
PRAIi ie. IS
PAZ 4 Sr
PA>3 I =
PrA4 & 5 ie‘
PRS Y 4
PRE b= 33
PRA?T 9 32
FRA a Ss
FBi 1 a
PB2 29
PB3 23
PE4 ev
PRS 25
PB& ea
PB’ 24
PC 23
TCD 22
YCC ai
100
DIE KONTROLLPORTS (Abfrage von Joysticks und Paddles)
Der Commodore 64 verfuegt, im Gegensatz zum VIC-20, ueber
zwei Kontrollports, die sich links vom Netzschalter befin-
den. An jeden dieser Ports laesst sich entweder ein Joystick
oder ein Paar Paddles anschliessen. Damit ist es zum Bei-
spiel jetzt auch bei Spielen fuer zwei Personen moeglich,
jedem Spieler einen Joystick zuzuordnen. Im folgenden wird
dem linken Kontrollport die Nummer 1, dem rechten die Nummer
2 zugeordnet (in Uebereinstimmung mit den Beschriftungen am
Geraet selbst). Die beiden Ports sind in Bezug auf die Ab-
frage von Joystick und Paddles funktionsgleich, Port 1 kann
jedoch zusaetzlich zum Anschluss eines Lightpens verwendet
werden. Doch laesst sich diese spezielle Eigenschaft des er-
sten Ports vielleich von Fall zu Fall auch im Zusammenhang
mit dem Joystick verwenden (siehe Erlaeuterung).
Der Joystick
Jeder Joystick ist ueber fuenf Signalleitungen, die alle an
die IRQ-CIA 6526 (CIA #1) fuehren, mit dem Computer verbun-
den. Dabei handelt es sich um die vier Leitungen fuer die
vier Hauptrichtungen des Joysticks sovie um eine Leitung
fuer den Feuerknopf. Die Joystickleitungen fuer den ersten
Kontrollport sind an den Datenport B der CIA #1 (U2) ange-
schlossen, die des zweiten Kontrollports sind mit Port A der
gleichen CIA verbunden. Hier die genaue Uebersicht ueber die
Bedeutungen der Portleitungen:
Kontrollport #1 Kontrollport #2
oben: Port BO Port AO
unten: Port Bl Port Al
links: Port B2 Port A2
rechts: Port B3 Port A3
Feuer: Port B4 Port A4
Dass die zugehoerigen Datenrichtungsregister auf Eingang
(Bitwert O0) geschaltet wurden, ist die Voraussetzung fuer
ein einwandfreies Funktionieren jeder Abfrageroutine von Da-
tenports.
wird der Joystick nun in eine bestimmte Richtung gehalten
(beziehungsweise der Feuerknopf gedrueckt), so ist das ent-
sprechende Bit des Datenports geloescht, ansonsten gesetzt.
Bei Diagonalrichtungen sind entsprechend die zwei Richtungs-
bits, aus denen sich die Diagonalrichtung zusammensetzt, ge-
loescht.
Allerdings hat dieses ganze Prinzip einen recht gewichtigen
Haken, der bestimmt jedem schon aufgefallen ist, der (bei
eingabebereitem Computer) mit dem Joystick experimentiert
hat: Es erscheinen Zeichen auf dem Bildschirm, obwohl kei-
nerlei Taste gedrueckt wird (bei Anschluss an Kontrollport
1) oder einzelne Tasten funktionieren nicht oder erzeugen
falsche Zeichen (bei Anschluss an Kontrollport 2), wenn der
Joystick benutzt wird. Dies resultiert aus der gemeinsamen
Benutzung der Datenleitungen der IRQ-CIA sowohl fuer Joy-
stick als auch Tastatur. Daher ist eine gleichzeitige (pa-
rallele) Benutzung von Joystick und Tastatur nicht moeglich.
Das folgende kurze Beispielprogramm fragt den Joystick des
ersten Kontrollports ab und gibt entsprechend Meldung auf
dem Bildschirm ab:
101
100 DIM A$ (4) : FOR I = O0 TO 4 : READ A$ (I) : NEXT
110 DATA OBEN, UNTEN, LINKS, RECHTS, FEUER
120 B = PEEK (56323) : POKE 56323, B AND 224
130 P = PEEK (56321) : POKE 56323, B
140 IF (P AND 31) = 31 GOTO 120
150 FOR 1I1=207T04
160 IF (P AND 2 % I) = O THEN PRINT A$ (I) " ";
170 NEXT : PRINT : GOTO 120
Um den zweiten Joystick abzufragen, muessen lediglich die
Adressen 56321 in 56320 sowie 56323 in 56322 geaendert wer-
den. Da die Anordnung der Leitungen identisch ist, ergeben
sich keine weiteren Aenderungen.
Die Abfrage der Diagonalrichtungen kann uebrigens gleichzei-
tig mit der Abfrage der vier Hauptrichtungen erfolgen, so-
dass nicht alle acht moeglichen Richtungen getrennt erkannt
werden muessen: Soll zum Beispiel eine Spielfigur durch den
Joystick gelenkt werden, so koennen durch aufeinanderfolgen-
des Herausfiltern der einzelnen Bits (und, falls ein Bit ge-
loescht ist, Verschiebung in die entsprechende Richtung) die
Diagonalrichtungen gleich mitberuecksichtigt werden.
Hierzu ein kurzes Beispiel:
Die Position einer Figur (zum Beispiel eines Sprites) wird
durch die Variablen X und Y festgelegt. Abfrage des Joy-
sticks an Port 1 und Aenderung der entsprechenden Variablen
durch folgendes Programm:
B = PEEK (56323) : POKE 56323, B AND 224
P = PEEK (56321) : POKE 56323, B
IF (P AND 1) =O0O THENY=Y-]
IF (P AND 2) = 0 THENY=Y+]1
IF (P AND 4) =0O THENX = X -]
IF (P AND 8) = O THENX = X +1
In Maschinensprache laesst sich dies durch das Herausshiften
von Bits und Abfrage durch die Carry (eventuell innerhalb
einer Schleife mit vier Durchlaeufen) und indiziertem Laden
des Wertes fuer die Erhoehung (Verminderung) des Wertes fuer
die Position natuerlich wesentlich eleganter und kuerzer
(und natuerlich schneller) erreichen. Die Abfrage der Feuer-
taste hat sinnvollerweise getrennt zu erfolgen.
Sollten sich aus der Tastaturabfrage des Betriebssystems
durch die Routine SCNKEY im Zusammenhang mit der Abfrage der
Joysticks Probleme ergeben (die eigene Routine wird beein-
flusst oder aehnliches), so kann die Interruptroutine (gene-
rell) abgeschaltet werden durch ...
POKE 563353, 1
Wieder eingeschaltet wird der IRQ durch ...
POKE 56333, 129
Allerdings kann waehrend dieser Zeit, in der IRQs nicht zu-
gelassen sind, keinerlei Abfrage der Tastatur durch GET oder
INPUT erfolgen (aber dies ist durch die gleichzeitige Benut-
zung des Joysticks wohl gar nicht erwuenscht beziehungsweise
moeglich). Auch sollte nach Beendigung der Abfrage des Joy-
sticks der IRQ unbedingt wieder zugelassen werden. Ist das
Programm naemlich beendet, so koennen ansonsten keinerlei
Eingaben gemacht werden, da keine Tastendruecke mehr er-
kannt werden.
102
Waehrend der Zeit abgeschalteten IRQs laeuft die interne
(softwaremaessig realisierte) Uhr NICHT weiter. Auch die
RUNSTOP-Taste wird nicht mehr abgefragt. RUNSTOP im Zusam-
menhang mit RESTORE ist jedoch auch weiterhin moeglich.
Die Paddles
An einen Kontrollport laesst sich je ein Paar Paddles an-
schliessen. Da jedoch der Sound-Baustein (SID 6581) des Com-
modore 64 nur ueber zwei Analog/Digital-Wandler verfuegt,
muss vor der Abfrage der Paddles angegeben werden, welches
Paddlepaar bei der Abfrage gemeint ist. Nur die Feuertasten
sind gleichzeitig abfragbar, da diese schliesslich nicht von
einem A/B-Wandler abhaengig sind, sondern (wie auch die
Joysticks) direkt mit den Ports der IRQ-CIA verbunden sind.
Diese beiden B-Bit-Register (POT X und POT Y genannt) des
SID 6581 fuer die Paddles geben die Stellung der Drehregler
an.
Die beiden Paddles werden gemaess der Position ihres Verbin-
dungskabels am Stecker fuer den Kontrollport mit 'Paddle
links' und 'Paddle rechts' bezeichnet. Es werden folgende
Register verwendet:
Paddle links: Paddle rechts:
Drehregler: SID 6581, POT Y SID 6581, POT X
Feuerknopf: CIA 6526, Portbit 2 CIA 6526, Portbit 3
Auch hier gilt, dass das Bit fuer den Feuerknopf geloescht
ist, wenn die Taste gedrueckt ist.
Wie erkennbar, werden die gleichen Leitungen benutzt, vie
von den Joysticks auch. Da aber an einen Kontrollport nicht
gleichzeitig Joystick und Paddle anschliessbar sind, Tresul-
tiert daraus auch kein Nachteil. Allerdings gelten auch hier
die in Bezug auf Tastatur und Joystick gemachten Einschraen-
kungen durch die gemeinsame Benutzung von Datenleitungen.
Zuerst zu den Feuerknoepfen: Wie dies auch bei den Joysticks
der Fall war, so ist auch hier dem linken Paddlepaar der
Port B und dem rechten der Port A zugeordnet. Mit 'Portbit'
in der obigen Uebersicht ist also jeweils das entsprechende
Bit im zugeordneten Datenport (A oder B) gemeint. Hier noch
einmal die Adressen der Register der CIA fuer die Kontroll-
ports:
56320: Portregister A
56321: Portregister B
56322: Datenrichtungsregister A
56323: Datenrichtungsregister B
Auch hier muessen natuerlich die entsprechenden Bits des
Datenrichtungsregisters auf Eingang geschaltet werden, um
die Feuerknoepfe abzufragen.
Befindet sich ein Drehregler am RECHTEN Anschlag, so ent-
haelt das entsprechende Register (SID 6581) den Wert 0, am
LINKEN Anschlag einen Wert um 200 (Commodore-Paddles), in
allen anderen Positionen einen entsprechenden Zwischenvert
(diese Werte unterliegen auch bei konstanter Reglerstellung
gewissen Schwankungen). Es ist moeglich, dass sich die Reg-
lerwerte von Paddle zu Paddle etwas unterscheiden, dies
sollte jedoch in Programmen zu keinerlei Problemen fuehren.
Eventuell kann in einem Programm aber auch festgestellt ver-
den (durch Anweisung an den Benutzer, den Regler zum linken
103
Der erste Wert wird nun in die Adresse 43, der zweite in die
Adresse 44 geschlrieben. Nun kann der LOAD-Befehl (ohne Anga-
be einer -Sekundaeradresse) vorgenommen werden (das zu laden-
de Programm muss natuerlich ein Relativprogramm sein). Ist
der Ladevorgang abgeschlossen, so muss der Pointer (43/44)
wieder auf den Anfang des ersten Programms gesetzt werden.
Dies erreicht man durch ...
POKE 43, 1 : POKE 44, 8
Sie haben so ervwirkt, dass beide Programme zu einem Programm
zusammengefuegt wurden.
Der Dateityp 5, der End-of-Tape-Block, wird zur Bandende-
Kennzeichnung verwendet und wird oft hinter dem letzten File
einer Cassettenseite abgespeichert, um unnoetiges weiteres
Suchen zu vermeiden. Wird beim Laden anstelle eines Daten-
oder Programmheaders ein solcher EOT-Block gefunden, so
sollte eigentlich "?FILE NOT FOUND ERROR" ausgegeben werden.
Allerdings geschieht dies aufgrund eines Fehlers im Be-
triebssystem, der auch schon beim VIC-20 aufgetreten ist,
nicht. Es wird die in diesem Zusammenhang sinnlose Meldung
"2DEVICE NOT PRESENT ERROR" gegeben (vgl. 0S-Listing an den
Stellen 62383 ff, 62806 ff, 63291 f sowie 57717 f).
Wie koennen nun diese ganzen verschiedenen Dateiarten (und
Bloecke) auf Band geschrieben werden? Hier eine Uebersicht
darueber:
SAVE "PROGRAMMNAME " Abspeicherung eines Programms als
Relativprogramm (meist BASIC)
SAVE "PROGRAMMNAME",1,1 wie oben, jedoch wird zusaetzlich
ein EOT-Block am Ende gespeichert
SAVE "PROGRAMMNAME",1,2 Abspeicherung eines Programms als
Absolutprogramm (meist 6502-Code)
SAVE "PROGRAMMNAME",1,3 wie oben, jedoch wird zusaetzlich
ein EOT-Block am Ende gespeichert
Bei den letzten beiden Beispielen wird es meist noch noetig
sein (falls das Maschinenprogramm auf diese Weise und nicht
ueber eine Maschinenroutine gespeichert wird), die Start-
und Endadresse (plus eins) des Maschinenprogramms festzule-
gen. Dies erreicht man durch Zerlegung beider Adressen je-
weils in LSB und MSB. Diese muessen dann in den Pointer fuer
die Startadresse (43/44) und Endadresse (45/46) von BASIC-
Programmen geschrieben werden. Dann kann das SAVE-Kommando
gegeben verden.
Beim Eroeffnen von Files auf Cassette gibt es folgende drei
Moeglichkeiten:
OPEN 1], 1, O0, "FILENAME" Eroeffnung eines Lesefiles
OPEN 1, 1, 1, "FILENAME" Eroeffnung eines Schreibfiles
OPEN 1, 1, 2, "FILENAME" Eroeffnung eines Schreibfiles
mit zusaetzlicher Abspeicherung
eines EOT-Blocks nach "CLOSE"
Beim Laden von Programmen, dazu gehoert auch der VERIFY-Be-
fehl, gibt es zwei Arten des Ladens:
104
Lightpen (Lightgun)
An den ersten Kontrollport kann ein Lightpen angeschlossen
werden. Dieser setzt, wenn seine Elektronik den Zeilen-
strahl, der das Bild auf dem Bildschirm aufbaut, erkennt,
die Leitung fuer die Feuertaste des Joysticks auf Lowpegel.
Da die Steuerleitung fuer die Feuertaste jedoch nicht nur
mit der IRQ-CIA verbunden ist, sondern auch mit dem Light-
pen-Input (active low), wird die Position des Zeilenstrahls
im Augenblick der negativen Flanke vom VIC-II-Chip aus in
ein anderes Register uebertragen, das dann zur Erkennung der
Position des Lightpens dient. Ausserdem wird bei aktivem
Lightpen-Input ein Interrupt ausgeloest (sofern zugelassen),
sodass das Computerprogramm nur dann die Lightpen-Position
feststellen muss, wenn es ueberhaupt noetig ist (per Inter-
ruptprogramm). Eine Lightgun wird jedoch noch mehr Verbin-
dungen zum Computer besitzen. So zum Beispiel eine Feuerta-
ste, die dann auch wirklich diese Funktion hat (dann aber
natuerlich nicht mehr mit der normalen Feuerleitung abge-
fragt werden kann), da die Leitung zur Feststellung der Po-
sition wohl fuer ein Spiel nicht ausreicht.
Da der Joystick des ersten Kontrollports jedoch auch mit
diesem Lightpen-Input verbunden ist, laesst sich dadurch die
Feuertaste (zum Beispiel waehrend des Demo-Modus' bei einem
Spielprogramm oder nach Beendigung des Spiels) auch zum Neu-
start des Spiels verwenden, ohne dass die Taste abgefragt
verden muss. Es wird nur eine Interruptroutine benoetigt
(die beim Druecken der Feuertaste aufgerufen wird, wenn das
zugehoerige Interrupt-Enable-Bit gesetzt wurde), die dann
einfach einen Neustart vornimmt. Natuerlich ist diese Anwen-
dung nur dann sinnvoll, wenn eine gewoehnliche Abfrage der
Feuertaste aufgrund der zeitlichen Ausdehnung einiger Pro-
grammroutinen den Benutzer zu lange warten liesse. Man
koennte zwar in jeder Routine die Taste abfragen, sodass
niemals zu lange auf eine Reaktion gewartet werden muesste,
dies koennte jedoch den Programmablauf verlangsamen oder zu
speicherplatzaufwendig sein.
Detailliertere Informationen in Bezug auf die Auswirkungen
und Zusammenhaenge des Lightpen-Inputs auf den VIC-II-Chip
finden sich bei der Erklaerung des Video-Chips.
105
DATENSPEICHERUNG AUF CASSETTE UND DISK
Der Commodore 64 bietet recht komfortable Befehle zur Daten-
speicherung, wozu auch die Speicherung von Programmen ge-
hoert. Dabei stehen Ihnen prizipiell zwei vom Betriebssystem
unterstuetzte Moeglichkeiten zur Verfuegung:
l. die Speicherung auf Cassette sovie
2. die Speicherung aüf einem Geraet, das an den seriellen
Bus anschliessbar ist, meist wohl ein Diskettenlaufverk.
Der Cassettenrecorder ist das wohl guenstigste Medium, um
Daten (meist Programme) zu speichern. Dies bringt jedoch
einige erhebliche Nachteile mit sich. Der wohl erheblichste
Nachteil ist, dass Daten nur direkt hintereinander geschrie-
ben und in der gleichen Reihenfolge auch wieder gelesen ver-
den koennen. Genausovwenig koennen Daten an eine Datei ange-
fuegt oder Inhalte einer Datei geaendert werden. Dazu muess-
te die gesamte Datei gelesen, modifiziert und wieder auf
Band geschrieben werden. Waehrend dieser Nachteil bei Pro-
grammen nicht so gravierend ist (schliesslich hat man ja ein
Zaehlverk, an dem man sich orientieren kann), so ist dies
doch bei der Datenspeicherung, speziell bei voneinander ab-
haengigen Dateien, ein solches Handicap, sodass bei komple-
xeren Dateiverwaltungen auf eine Diskettenstation wohl nicht
verzichtet werden kann.
Ein weiterer, schwerwiegender Nachteil ist die Geschwindig-
keit der Datenuebertragung auf Band. Waehrend selbst ein
langes Programm in nur einigen Sekunden von Diskette gelesen
werden kann, so koennen beim Laden von Cassette schon einige
Minuten (zuzueglich der Zeit fuer das Umspulen der Cassette)
zusammenkommen.
Datenspeicherung auf Cassette
Sollen Daten auf Band geschrieben werden, so wird erst ein-
mal ein Vorspann, bestehend aus einem hohen Ton, auf Casset-
te geschrieben. Darauf folgt ein sogenannter "Header", der
(genauso wie das auf den Header folgende Programm oder der
Datenblock) zweimal hintereinander geschrieben wird, um Feh-
ler, die beim Lesen eventuell auftreten, korrigieren zu
koennen. Die Commodore-Computer koennen maximal 31 Fehler
pro Block (das kann ein Header, ein ganzes Programm oder ein
Datenblock sein) korrigieren, wenn im zweiten Block diese
Daten lesbar vorhanden sind. Werden auch beim Lesen des
zweiten Blocks Fehler in den Bytes, die im ersten Block
nicht lesbar waren, erkannt, so wird Bit 4 der Statusvaria-
blen ST gesetzt. Ist ein Blockende erkannt worden, ohne dass
alle Daten gelesen werden konnten, so wird Bit 2 (short
Block) gesetzt. Entsprechend vird Bit 3 (long Block) ge-b
setzt, wenn bereits alle Daten gelesen wurden, ohne dass ein
Blockende erkannt wurde. Als eine weitere Fehlermoeglichkeit
besteht der sogenannte Pruefsummenfehler (Bit 5). Dieser
tritt auf, wenn die beim Abspeichern des Programms mitgege-
bene Pruefsumme (sie entsteht aus der Exklusiv-Oder-Ver-
knuepfung saemtlicher Datenbytes) nicht mit der beim Lesen
errechneten (erwarteten) Pruefsumme uebereinstimmt.
Bei der Speicherung von Daten werden diese vor der Abspei-
cherung erst einmal in einem Puffer von 192 Bytes im Bereich
von 828 bis 1019 gesammelt, der dann, wenn er gefuellt ist
(beziehungsveise, wenn das File geschlossen wird), auf Band
geschrieben wird. Aehnliches erfolgt beim Einlesen: Es wird
immer ein ganzer Datenblock auf einmal gelesen (auch wieder
106
in den Bereich von 828 bis 1019), aus dem dann die Daten
stueckweise durch Befehle wie GET# und INPUT# geholt werden.
Wuerden die Daten immer direkt auf Band geschrieben (bezie-
hungsweise von Band geholt werden), so muesste man jedesmal
den Vorspann, die Synchronisationsbytes und alles andere
mitschreiben (da sonst die Daten nicht fehlerfrei gelesen
werden koennten, schliesslich muss der Recordermotor erst
wieder anlaufen), egal wie kurz der Block waere. Da dadurch
jedoch die Geschwindigkeit noch weiter herabgesetzt werden
wuerde, hat man sich wohl fuer das Puffer-Prinzip entschie-
den.
Der eben schon erwaehnte Header enthaelt die Informationen
darueber, um welche Art von Datenfile es sich bei dem fol-
genden handelt. Ausserdem ist in ihm der Programmname (oder
Filename) und, falls es sich um ein Programm handelt, die
Start- und Endadresse enthalten. Der Header wird, genauso
vie die Datensaetze (die prizipiell ihr eigener Header
sind), im Cassettenpuffer aufgebaut und dorthin auch wieder
eingelesen.
Hier der Aufbau des Headers:
Adresse 828: Kennzeichnung fuer Dateityp
829 bis 830: Startadresse des Programms (low, high)
831 bis 832: Endadresse+l des Programms (low, high)
833 bis 848: Filename (Ausgabe bei "FOUND")
849 bis 1019: Filename (keinerlei Ausgabe)
Wird beim Abspeichern eines Programms (oder beim schreiben-
den Eroeffnen eines Files) ein Filename (bestehend aus mehr
als 16 Zeichen) angegeben, so werden diese "ueberschuessi-
gen" Zeichen durchaus abgespeichert, da maximal 187 Zeichen
als Filename zugelassen werden. Allerdings werden beim Ein-
lesen nur noch die ersten 16 Zeichen ausgegeben, die restli-
chen bleiben unsichtbar, koennen jedoch mittels CHR$ und
PEEK ausgelesen werden. Diese weiteren Zeichen werden jedoch
beachtet, wenn beim lesenden Zugriff auf Band, sei es durch
LOAD, VERIFY oder OPEN, der Filename des zu suchenden Files
angegeben wird. Ist dieser naemlich laenger als 16 Zeichen,
so wird fuer den Vergleich, ob das richtige File gefunden
wurde, auf den "unsichtbaren" Rest des fFilenamens zugegrif-
fen. Die Verwendung von Filenamen mit mehr als 16 Zeichen
ist jedoch bei der normalen Verwendung des Bandgeraets un-
veblich.
Als Kennzeichnung fuer den Dateityp (Adresse 828) stehen
folgende Moeglichkeiten zur Auswahl:
Relativprogramm (wird an BASIC-Startadresse geladen)
Datenblock, folgende 191 Bytes sind Daten (Filehandling)
Absolutprogramm, wird an angegebene Stelle geladen
Dateiheader, folgende Bloecke sind Datenbloecke
End of Tape (EOT) Block, Kennzeichnung fuer Bandende
n£e£UuN
. eo . 0.0. 00
Der Dateityp 2 gibt an, dass es sich bei diesem Block um Da-
ten handelt, die mittels PRINT# auf Band geschrieben wurden
und durch GET# und INPUT# gelesen werden koennen.
Dieser Blocktyp enthaelt selbst keinen Programmnamen, dieser
steht zu Beginn des Files (es koennen. mehrere Bloecke vom
Typ 2 hintereinander stehen, je nach Laenge der Datei) im
Dateiheader (Headertyp 4), der beim lesenden Zugriff unbe-
dingt gefunden werden muss, da der Computer ansonsten nichts
mit den folgenden Datenbloecken anfangen kann.
107
Die Dateitypen 1 und 3 werden fuer die Speicherung von Pro-
grammen verwendet. In diesen beiden Faellen sind auch die
vier Bytes nach dem Kennungsbyte innerhalb des Dateiheaders
benutzt. Sie enthalten die Startadresse und die Endadresse
(plus eins, wie dies bei den meisten Endpointern der Fall
ist) des Programms. Diese wird beim Schreiben auf Band fest-
gestellt und dem Header mitgegeben.
Handelt es sich bei dem gelesenen Header um Typ 3, so wird
das Programm an die Adresse geladen, an der es sich befand,
als es auf Cassette gespeichert wurde. Dies kann bei Maschi-
nenprogrammen sehr nuetzlich sein, da dann das Transferieren
in den Speicherbereich, in dem sie ablaufen sollen, ent-
faellt. Auch koennen solcherart abgespeicherte Programme
nachtraeglich eingeladen werden, ohne dass ein schon im AT-
beitsspeicher befindliches BASIC-Programm (sofern es nicht
in den vom Maschinenprogramm belegten Bereich hineinreicht)
ueberschrieben wird. Allerdings muss auch hier die folgende
Vorgehensweise beachtet werden:
Vor dem Einladen des Programms muss der Wert des Pointers
(45/46) gemerkt werden. Dies kann einfach durch PEEK erfol-
gen. Nun koennen Sie das gewuenschte Maschinenprogramm, das,
wie gesagt, nicht im gleichen Bereich liegen darf wie das
schon im Arbeitsspeicher befindliche BASIC-Programm, nachla-
den. Ist der Ladevorgang abgeschlossen, so stellen sie den
alten Wert des Pointers (45/46) durch POKE wieder her. Die-
sen POKEs muss unbedingt (!) ein CLR folgen, damit auch die
zugehoerigen anderen Pointer richtig gesetzt werden. Auch
muss bedacht werden, dass das eingeladene Maschinenprogramm
(je nach Lage) vielleicht vor dem Zugriff durch das Be-
triebssystem geschuetzt werden muss.
Bei dem Dateityp 1] handelt es sich meist um BASIC-Programme,
deren Startadresse (im Normalfall) unbeachtet bleibt. Statt-
dessen werden sie an die Startadresse des BASIC-Bereichs
(Standardvert 2049) geladen. Allerdings kann auch bei diesem
Programmtyp ein Laden in den urspruenglichen Programmbereich
erzwungen werden. Dies erreicht man durch einen LDAD-Befehl
mit Sekundaeradresse ungleich null.
Durch den Programmtyp des Relativprogramms kann 'ein Zusam-
menhaengen von Programmen erreicht werden. Dazu muss einfach
der Pointer auf die Startadresse von BASIC-Programmen
(Adressen 43 und 44) auf das Ende des im Arbeitsspeicher be-
findlichen Programms gesetzt werden. Allerdings muss das an-
zuhaengende Programm groessere Zeilennummern haben, als das
im Arbeitsspeicher befindliche Programm. Hier die genaue
Angabe der Methode:
Feststellung der Endadresse des Programms im Arbeitsspeicher
durch
E = PEEK (45) + 256 * PEEK (46)
Von diesem Wert muss nun der Wert zwei subtrahiert werden
(siehe: Interne Codierung von BASIC-Programmen) ...
E=-E-2
Dieser Wert muss nun wieder in zwei Bytes zerlegt werden.
Dies geschieht durch
PRINT E - 256 * INT (E / 256), INT (E / 256)
108
und rechten Anschlag zu drehen), wo die Minimal- und Maxi-
malwerte liegen.
Die Register, aus denen die Werte fuer die Drehregler ausge-
lesen werden koennen, befinden sich an den Adressen 54297
(POT X, Paddle rechts) und 54298 (POT Y, Paddle links). Da
wohl nur selten alle 256 Werte (oder 200, siehe oben) sich
in der Darstellung auf dem Bildschirm voneinander unter-
scheiden werden, ist es wohl sinnvoll, entweder nur Werte
innerhalb bestimmter Grenzen zu verarbeiten und darueber hi-
nausgehende Werte als Maximal- beziehungsweise Minimalvert
zu betrachten. Eine andere - jedoch aufvendigere - Methode
waere, den Wert aus dem Register so zu dividieren, dass ge-
nau die Spanne an Werten herauskommt, die fuer die Verarbei-
tung sinnvoll ist.
Jetzt fehlt nur die Information darueber, wie die beiden
Paddlepaare bei Abfrage des Reglervwertes ausgewaehlt werden
koennen. Die Auswahl erfolgt ueber Bit 6 und 7 von Port A
der IRQ-CIA. Wie sofort erkennbar, entstehen auch hier wvie-
der Konflikte mit der Tastatur, die sich hier jedoch durch
Abschalten des Interrupts verhindern lassen.
Ist Bit 6 dieses Ports gesetzt und Bit 7 geloescht, so sind
die Register POT X und POT Y des SID 6581 dem linken Paddle-
paar (Kontrollport 1) zugeordnet. Ist dahingegen Bit 6 ge-
loescht und Bit 7 gesetzt, so kann die Reglerstellung des
rechten Paddlepaares (Kontrollport 2) festgestellt werden.
Nach so viel theoretischer Erklaerung auch hierzu wieder ein
Beispielprogramm ...
100 PA 56320 : PB = 56321 : DB = 56323 : CA = 56333
110 PY 54298 : PRINT CHR$ (147)
120 PRINT " KONTROLLPORT 1 KONTROLLPORT 2
130 PRINT " PADDLE PADDLE
140 PRINT " LINKS RECHTS LINKS RECHTS" : PRINT : PRINT
150 PRINT CHR$ (145); : POKE CA, 1: FOR I =0T01
160 POKE PA, 127 + 64 * IT : D = PEEK (DB - I)
170 POKE DB - I, D AND 243 : P = PEEK (PB - I)
180 POKE DB - I, D : PRINT" "; : FOR IJ =0T0O1
190 IF (P AND 2 ? (3 - J)) = DO THEN PRINT CHR$ (18);
200 PRINT RIGHT$ (" " + STR$ (PEEK (PY - J)), 4);
210 PRINT " " CHR$ (146) SPC(3); =: NEXT : NEXT : PRINT
220 POKE CA, 129 : GET G$ : IF G$ CD) CHR$ (13) GOTO 150
Das Programm gibt zu jedem der vier moeglichen Paddles den
jeweiligen Wert des Drehreglers an. Ist ausserdem die Feuer-
taste gedrueckt, so wird der Wert winvertiert (in Negativ-
schrift) dargestellt. Das Programm laesst sich durch Druek-
ken von RETURN abbrechen (durch den abgeschalteten IRQ muss
die Taste eventuell laenger gedrueckt gehalten verden).
109
LOAD "PROGRAMMNAME" Lesen eines Programms, wie es im
Programmheader angegeben wurde.
(also’ Absolut oder Relativ)
LOAD "PROGRAMMNAME",1,] Absolutes Einladen eines Programms
in den im Header spezifizierten
Speicherbereich
Noch eine Anmerkung zur Speicherung (speziell von Maschinen-
programmen): Der Commdore 64 kann, im Gegensatz zu allen
vorherigen Modellen von Commodore, ohne zusaetzliche Hilfs-
programme auch den Speicherbereich ab 32768 auf Cassette
speichern. Dies ist beim Commodore 64 noetig geworden, da
BASIC-Programme ja auch in den Bereich ueber 32767 hinein-
reichen koennen. So ist es aber nun zum Beispiel auch moeg-
lich, den 4-KB-RAM-Bereich von 49152 bis 53247, in dem sich
viele Maschinenutilities unterbringen lassen, auf Cassette
zu speichern.
Datenspeicherung auf Diskette
Der Vorteil beim Arbeiten mit fFloppy-Disc liegt darin, dass
beliebig auf jeden einzelnen Block einer Diskette zugegrif-
fen werden kann. So muss auch beim Lesen und Schreiben auf
Diskette nicht erst der Kopf durch getrennte Befehle posi-
tioniert werden. Dies alles erfolgt automatisch durch das
Diskettenbetriebssystem. Wird ein verlangtes File nicht ge-
funden, so wird die Fehlermeldung "?FILE NOT FOUND ERROR"
gegeben.
Beim Abspeichern von Programmen auf Diskette kann nicht spe-
zifiziert werden, ob es sich um ein Maschinenprogramm han-
delt (die Angabe eines EOT-Blocks ist sowieso unsinnig).
Dies wird beim Einladen angegeben, aehnlich, wie es auch bei
Cassette moeglich var:
LOAD "PROGRAMMNAME",B Einladen eines Programms an den
Speicheranfang (BASIC-Programme)
LOAD "PROGRAMMNAME",B,1 Einladen eines Programms an den
beim Abspeichern angegebenen
Speicherbereich
Auch beim Laden von Diskette ist das Zusammenhaengen von
BASIC-Programmen moeglich. Hierzu muss genauso vorgegangen
verden, wie beim APPEND von Cassette. Die Abspeicherung von
Maschinenprogrammen erfolgt wie bei Cassette auch, jedoch
wird bei der Abspeicherung auf Diskette keinerlei Sekundaer-
adresse angegeber. Dies ist zwar moeglich, es hat aber kei-
nerlei Auswirkung auf den Abspeicherungsvorgang.
Nun zu den internen Vorgaengen beim Abspeichern und Einlesen
von Programmen im Zusammenhang mit Diskette:
Wird ein Programm auf Diskette geschrieben, so wird ein file
mit der Sekundaeradresse 1 eroeffnet. Dies ist fuer die Conm-
modore-Laufwerke der Hinweis dafuer, dass ein Datenfile vom
Typ "PRG" eroeffnet werden soll. Die ersten beiden Bytes,
die dann auf dieses file ausgegeben werden, sind die Start-
adresse des Programms in Low/High-Darstellung. Eine End-
adresse wird nicht mitgegeben. Das Programmende bei der Da-
tenuebertragung wird der Floppy-Disk durch ein EOI mitge-
teilt.
Das Einlesen erfolgt durch Eroeffnung eines Files mit der
Sekundaeradlresse 0. Auch diese spezielle Sekundaeradresse
110
ist ein Hinveis fuer die Diskettenstation: Es wird ein File
vom Typ "PRG" zum Lesen eroeffnet. Dann werden die ersten
beiden Bytes gelesen und als Ladezeiger gespeichert. Diese
beiden Bytes werden jedoch nur dann auch als Ladezeiger ver-
wendet, wenn eine Sekundaeradresse ungleich null dem LOAD-
Kommando mitgegeben wurde. Ansonsten wird cas Programm in
den fuer BASIC-Programme vorbereiteten Bereich geladen.
So kann zum Beispiel die Startadresse eines Programms auf
Diskette durch folgendes kurzes Segment festgestellt werden:
OPEN 1, 8, O, "PROGRAMMNAME" : GET#1, L$, H$ : CLOSE 1
PRINT ASC (L$ + CHR$ (0)) + 256 * ASC (H$ + CHR$(0))
Durch Angabe der Sekundaeradresse O wird der LOAD-Befehl si-
muliert, wodurch weitere Angaben innerhalb des Filenamens
entfallen. Der Zusatz 'CHR$(0)' wird benoetigt, da das Be-
triebssystem bei GET# den Leerstring anstelle des Nullcodes
uebermittelt. Der ASC ist fuer den Leerstring allerdings
nicht definiert. Daher wird diese Stringaddition vorgenon-
men.
OVERLAY (Nachladen von Programmen unter Programmkontrolle)
wird der LOAD-Befehl (unabhaengig vom angesprochenen Geraet)
innerhalb eines Programms gegeben, so wird nach dem Einladen
des Programms der CHRGET-Pointer auf den Anfang des BASIC-
Bereichs gesetzt. Ein nachgeladenes Programm wird daher so-
fort gestartet. Aber Achtung: Um die Variableninhalte nicht
zu zerstoeren (sie koennten im nachgeladenen Programm ja
noch benoetigt werden), wird keinerlei CLR ausgefuehrt. Auch
wird der BASIC-Endepointer (Variablenanfangspointer) nicht
gesetzt, er behaelt seinen alten Wert bei. Ein nachgeladenes
Programm darf daher niemals laenger als das aufrufende Pro-
gramm sein. Auch muss beachtet werden, dass ein nachgelade-
nes Programm niemals wieder abgespeichert werden sollte.
Schliesslich stimmen die Endezeiger nicht, so dass das Pro-
gramm mehr Platz belegen wuerde, als wirklich notwendig wae-
re.
Hier noch die Einschraenkungen bei der Uebernahme von Varia-
blen: Stringinhalte, die direkt zugewiesen wurden, werden
nicht uebertragen (der Stringdescriptor zeigt direkt in den
BASIC-Text). Dies kann jedoch durch Addition des Leerstrings
umgangen werden. Also beispielsweise
A$ = "STRINGINHALT" + ""
anstelle von
A$ = "STRINGINHALT"
Auch muessen ueber 'DEF' definierte Funktionen neu definiert
verden, da auch der Pointer des 'FN-Variableneintrags' di-
rekt in den BASIC-Text zeigt, der jedoch nach dem Nachladen
nicht mehr in dieser Form vorhanden ist. Eine genaue Erklae-
rung der Abspeicherung von FN-Variableneintraegen findet
sich bei der Erklaerung der Darstellung und Ablage von Va-
riablen.
Werden die Variableninhalte aus dem aufrufenden Programm je-
doch nicht mehr weiter benoetigt und koennen daher geloescht
werden, so empfiehlt es sich, das Kommando zum Nachladen
durch den Tastaturpuffer zu geben. Dies kann fuer Diskette
erfolgen durch
111
A$ = "PROGRAMMNAME "
PRINT CHR$ (147) : PRINT
PRINT "LOAD" CHR$ (34) A$ CHR$ (34) ",8"
PRINT : PRINT : PRINT : PRINT : PRINT "RUN" CHR$ (19);
POKE 631, 13 : POKE 632, 13 : POKE 198, 2
END
Dieses Programm schreibt den auszufuehrenden Text auf den
Bildschirm und laesst diesen dann durch ein simuliertes
Druecken der RETURN-Taste interpretieren.
Es ist auch moeglich, wenn der Ladebefehl im Programm gege-
ben wurde (und nicht ueber den Tastaturpuffer), die BASIC-
Endepointer nach dem Pointer (174/175) zu setzen, da dieser
die Endadresse des soeben geladenen Programms angibt. Aller-
dings verlangt diese Programmierung eine Kontrolle, da, venn
das Programm nach einer Aenderung direkt mittels "RUN" ge-
startet wird, die Endepointer dann falsch gesetzt werden.
Eine Moeglichkeit des Abfangens dieses Effektes bestuende
darin zu pruefen, ob der Variablenendepointer gleich dem Va-
riablenanfangspointer ist. Dies ist schliesslich nach dem
Starten eines Programms durch "RUN" der Fall, waehrend es
beim Nachladen nicht der Fall ist (die Variableninhalte
bleiben erhalten).
Soll vom Hauptprogramm aus ein Maschinenprogramm nachgeladen
werden, so hat das Nichtsetzen der Endepointer den grossen
Vorteil, dass das Programm ungestoert wveiterlaufen kann.
Hier ein Beispiel fuer einen Programmanfang, der ein benoe-
tigtes Maschinenprogramm nachlaedt:
100 IF A = O0 THEN A = 1 : LOAD "MASCHINENPROGRAMM", 8
110 ...
Da nach dem Starten eines Programms durch "RUN" saemtliche
Zahlenvariablen den Wert null haben, werden die Befehle nach
der IF-Abfrage ausgefuehrt. Die Variable A wird nun aber auf
den Wert eins gesetzt. Nachdem das Maschinenprogramm nachge-
laden wurde, werden die CHRGET-Pointer auf den Programman-
fang gesetzt, die Variableninhalte jedoch nicht geloescht.
Nun hat die Variable A jedoch nicht mehr den Wert null, es
wird in der naechsten Zeile mit der- Programmausfuehrung
fortgefahren. |
Dieser Effekt laesst sich auch verwenden, wenn man nach-
traeglich zum Beispiel Maschinenutilities nachladen will.
Man gibt dazu in das momentan vorhandene BASIC-Programm (das
die Zeilen DO und 1 nicht enthalten darf) nur ein
0 END
1 LOAD "MASCHINENPROGRAMM"
... und startet es durch ...
RUN 1
Das Maschinenprogramm wird nun nachgeladen, ohne dass etwas
weiteres geschieht. Man erspart sich so das Merken und Wie-
derherstellen der Pointer auf das Ende des BASIC-Programnms.
Allerdings sollte man die beiden Programmzeilen nach Aus-
fuehrung wieder entfernen.
112
PRAKTISCHE ANWENDUNG DER "TIME OF DAY"
Wer die softwaremaessig realisierte Uhr des Commodore 64
(ueber die Systemvariablen TI und TI$ abfragbar) schon ein-
mal ueber laengere Zeit hat arbeiten lassen, der weiss, dass
diese nicht unbedingt als genau zu bezeichnen ist (circa
zwei Prozent Abweichung), was aber bei dieser Art der Ver-
wirklichung leider nicht vermeidbar ist.
Daher wird man vielleicht eine der in den CIAs eingebauten
Uhren einmal verwendet haben. Da diese von der Netzfrequenz
getaktet werden, weisen sie eine sehr hohe Ganggenauigkeit
auf. Allerdings ist die Benutzung dieser Uhren (die vom
hardwaremaessigen Konzept her sehr gut durchdacht sind) mit
einigen Problemen verbunden. Das Arbeiten mit den beiden Uh-
ren wird in keiner Weise direkt vom Betriebssystem unter-
stuetzt. Man muss also eine eigene Abfrageroutine erstellen,
die die Inhalte der vier Register in irgendeiner Form so
verarbeitet, dass man die Uhrzeit in einem brauchbaren For-
mat vorliegen hat. Auch das Setzen der Uhrzeit kann nicht
mehr einfach durch Zuweisung erfolgen. Zuerst muss die Uhr-
zeit in einzelne Ziffern zerlegt werden, die dann abgespei-
chert werden. Abgesehen davon werden Stunden nicht mehr im
Bereich von O Uhr bis 23 Uhr, sondern von 1] Uhr bis 12 Uhr
angegeben (zusammen mit dem Hinweis, ob es Vormittag oder
Nachmittag ist). Man wird daher, so gut das BASIC-Unterpro-
gramm auch sein man, nicht mit dem Komfort arbeiten koennen,
wie man ihn von "TI$" her gewohnt ist. Ausserdem tritt (je-
denfalls bei einer Netzfrequenz von 50 Hertz) ein weiteres
Problem auf: Sobald man ein Programm mittels "RUNSTOP/RE-
STORE" abbricht, geht die Uhr auffaellig nach. Dies liegt
daran, dass die Flag fuer die Taktfrequenz (MSB von CRA)
beim Druecken von "RUNSTOP/RESTORE" sofort auf 60 Hertz zu-
rueckgesetzt wird. Man muesste also bei jedem Druecken die-
ser beiden Tasten diese Flag wieder neu setzen.
Ausserdem scheint bei der Entwicklung der CIAs ein Fehler
(?) aufgetreten zu sein: Versucht man das Stundenregister
auf 12 Uhr zu setzen, so wird der gespeicherte Flagvwert fuer
AM/PM sofort umgekehrt. Stellt man also 12 Uhr nachmittags
ein, so zeigt die Uhr zwoelf Uhr vormittags (nachts) an (und
umgekehrt).
All dieses wurde durch ein kurzes Maschinenprogramm besei-
tigt: Man kann genauso komfortabel (wenn nicht komfortabler)
mit der eingebauten Uhr arbeiten, wie mit "TI$" auch. Es ist
moeglich, die Uhrzeit festzusetzen und sie wieder auszule-
sen. All dies geschieht ueber die USR-Funktion des Commodo-
re-BASICs. Um die Uhrzeit festzusetzen, muss einfach nur
eingegeben werden
A = USR ("hhmmsst")
Dabei steht "hh" fuer die Stunden (von O bis 23!), "mm" fuer
die Minuten, "ss" fuer die Sekunden (beides von 0 bis 59)
sowie "t" fuer die Zehntelsekunden. Es existiert also eine
Stelle mehr, als bei "TI$". Ist die Uhrzeit korrekt angege-
ben worden, so enthaelt die Variable "A" den Wert null. Wur-
de das Format missachtet (falsche Laenge, keine Ziffern,
falscher Bereich fuer Stunden, Minuten oder Sekunden), so
enthaelt "A" den Wert "-1". So ist also keine Ueberpruefung
der Eingabe durch das Programm noetig. Es wird der Wert
mittels USR an das Maschinenprogramm uebergeben, worauf die-
ses dann meldet, ob die Eingabe korrekt war. Fuer "A" kann
natuerlich jede andere numerische Variable stehen.
113
au
1108
12a
130
144
150
168
170
134
170
zagı
2108
22a
238
240
250
284
ra
era
Das Lesen der Uhrzeit erfolgt durch ...
A$ = USR (beliebiger numerischer Ausdruck)
Anstelle von A$ kann natuerlich eine andere Stringvariable
stehen. Auch die Weiterverarbeitung des Ergebnisses winner-
halb eines Ausdrucks ist moeglich. Die Funktion liefert die
Uhrzeit in genau dem Format, wie es auch eingegeben werden
muss.
Auch das Druecken von "RESTORE" ist mit keinerlei Gefahren
fuer die Genauigkeit mehr verbunden, da das Programm ausser
dem USR-Vektor auch noch den NMI-Vektor "umbiegt". Es er-
folgt also eine eigene Behandlung des NMIs, sodass die Flag
fuer die Netzfrequenz beim I/O-Reset immer auf .SQN Hertz ge-
setzt wird. Die eigene Behandlung eines gedrueckten "RE-
STORE" hat allerdings einen kleinen Nachteil: Befindet sich
ein Steckmodul im Commodore 64, das seinen eigenen Vektor
fuer die NMI-Routine besitzt, so bleibt dieser Vektor fortan
unbeachtet, da es ja sein koennte, dass diese eigene Routine
auch die Flag wieder auf 60 Hertz setzt.
Das Maschinenprogramm liegt im Bereich ab 49152, der vom BA-
SIC nicht benutzt wird. Das Aendern fuer andere Bereiche
duerfte jedoch nicht schwer fallen, da das Programm im Prin-
zip recht logisch aufgebaut ist. Wird bei der Eingabe der
DATA-Zeilen ein Fehler gemacht, so wird dieser in den mei-
sten Faellen durch das Programm bemerkt. Ist das Maschinen-
programm durch den BASIC-Traeger abgelegt worden, so kann es
durch ...
SYS 49152
... aktiviert werden. Es werden der USR- und der NMI-Vektor
auf eigene Routinen gesetzt sowie die Taktfrequenzflag auf
50 Hz gesetzt. Auch das Ausschalten ist moeglich. Hierbei
wird der USR-Vektor wieder auf "?ILLEGAL QUANTITY ERROR" ge-
setzt, der NMI-Vektor erhaelt seinen Normalwert, den er beim
Einschalten hat. Die Uhr laeuft natuerlich weiter (auch
durch zum Beispiel Recorderoperationen wird diese nicht an-
gehalten). Das "Abschalten" erfolgt durch ...
SYS 49253
Das Maschinenprogramm hat eine Laenge von 308 Bytes. Hier
das Listing zum Eingeben ...
REM "TIME OF DAY" «IRB-CIR> FUER DEN COMMODORE 84
FOR1=249152T0494593 :RERDA : A=R+% : Y=R-"TV :POKEI.AR:NERT
IF3<>349B890RY<L>4 1 PTHENPRINT :PRINT"CHECKSUM ERROR
DATR1693,122,141.17,3,169.192,.141,.12.3.163,.29.141.24.3.153,.192,.141.25,3.172
DATA14,228,9,128,141,.14,.220, 96.72.138,72,152,72.169.127.141. 13.221.172,13
DATR221,18,3,76,114.254.32,188,246,32.2253,255.208,243,162,4- 189.47 ,253.157
DATA19,3,202,203,247,162,26.139,53,253,1597,25.3.202,202,247,1689,127.141.13
DATR220.141.13,221, 141,,2 >20, 169,135,141, 14,220, 169.8.32, ı 253.76,198.254
DATA169, 72.141, 17.3.169,178.191,13,3,1689.71.141,.24.3,.169,294.141.29.3.968
DATA35,13,16.1093,32,130,.183. 192,7,208, 81, 173, 15.220,41,12 7,.141,15.220. 160.
DATA169,26..32,200,.192 -170,208,.2,169,.36, 2a. 19.144.7.248, 56.233. 12,216.93
DATR128.141,.11.220,32.138,192.141, 10.220.232, 193,.192,1491,9.220.32,43,.193
DATA141,8,220. 169.,76. ga,155,1a4,104,.1043.104,.169, 255 ‚208.245 ‚153.96,133. 38
DATA32.221.192,14,10,10,.10,133.37,32,221.192,53,.37,197 ‚25 ,176..228,96 „177.34
DATASE.232.48, 144,213, 201 ,.1a,178,.214, 209.96, 159,7,32,123,.18a,184,.17 3.11
DATA229,8,.41,.31,2401,18,.208,2.169.,49.168,5,.248.24,.105- 32.21, 193. 2
DATA19,220,.32,31,193,173,.3,.229,.32.31.193,173.8,220,.32 ‚133. 104. 104.
DATA202,180,72.74,74,74,74,32.42,193,104,431.15,.3,.493, a 35.32, 221
DATA192,96
114
ADAPTION VON CBM-PROGRAMMEN AN DEN COMMODORE 64
Bei der Adaption von BASIC-Programmen der uebrigen Commodo-
re-Computer muss eine Unterscheidung gemacht werden, da BA-
SIC-Programm nicht gleich BASIC-Programm ist. Folgende Un-
terteilung soll hier gewaehlt werden:
l. "reine" BASIC-Programme OHNE maschinennahe Befehle vie:
WAIT, POKE, PEEK, SYS, USR
2. BASIC-Programme OHNE die Befehle SYS und USR
3. kombinierte BASIC- und Maschinenprogramme mit SYS und USR
Programme des Typs 1 sind im Normalfall ohne Einschraenkun-
gen auf den Commodore 64 uebertragbar. Einige Befehlssequen-
zen werden sich sogar vereinfachen lassen, speziell bei Pro-
grammen des PET 2001, da das BASIC in bestimmten Feinheiten
noch modifiziert wurde. Bei Programmen des CBM 8032 wird das
Bildschirmformat (auch in Hinsicht der Fensterdefinitionen)
geaendert werden muessen. Ausserdem duerfen natuerlich keine
BASIC 4.0-Befehle wie "CATALOG" oder aehnliches vorkommen.
Die UVebertragung von Programmen des Typs 3 wird im Normal-
fall nur sehr schwer moeglich sein, speziell wenn auf I/0-
Bausteine zugegriffen wird. Auch die Strukturen der 05's un-
terscheiden sich stark von der des Commodore 64. Daher wird
es meist nur dem versierten Assembler-Programmierer moeglich
sein, diese Programme zu adaptieren. Benoetigte neue System-
unterlagen dazu (entsprechend dem ROM-Listing) sind bei uns
staendig in Entwicklung. Fragen Sie bei Bedarf einfach nach.
Im folgenden nun Hinweise fuer die Anpassung:
Das Einladen von Programmen kann einfach durch den LOAD-Be-
fehl erfolgen. Dies ist trotz der unterschiedlichen Anfangs-
adresse moeglich, da "LOAD" das Programm an den Anfang des
BASIC-Bereichs verschiebt. Lediglich bei Cassettenprogram-
men, die auf dem PET 2001 aufgenommen wurden, muss VOR dem
Laden "POKE 43, 0" und nach dem Laden "POKE 43, 1" eingege-
ben werden, da hier das Abspeichern von Programmen ab Adres-
se 1024 vorgenommen wurde.
Die meistverwendeten systemspezifischen Befehle des BASICs
2.0 und 4.0 sollen aufgefuehrt werden:
Die Befehle "POKE 59468, 14" und "POKE 59468, 12" bewirken
die Umschaltung zwischen Kleinschrift (14) und Graphik (12).
Dies erfolgt beim 64er durch "PRINT CHR$ (14)" und "PRINT
CHR$ (142)".
In Spielen werden oft die Adressen 151 und 152 verwendet.
151 enthaelt den Code der gedrueckten Taste, entsprechend
203 beim Commodore 64. Die Shift-Taste wird statt 152 durch
653 (zusammen mit Commodore und Control!) festgestellt. Al-
lerdings enthaelt 151 in dem Falle, dass keine Taste ge-
drueckt ist nicht den Code 64 sondern vielmehr 255.
Der Bildschirm ist ein weiterer "kritischer" Bereich. Hier
muessen Adressen von 32768 bis 33767 (oder bis 34767 beim
80-Zeichen-Schirm) in den Bereich von 1024 bis 2023 umge-
rechnet werden. Ausserdem muss die Register der Color-Nybb-
le-Area belegt werden. Man kann sich die Arbeit jedoch we-
sentlich vereinfachen, wenn man den Anfang der Video-Matrix
wie beim VIC-II-Chip beschrieben auf die Adresse 32768 legt.
115
Auch die Verwendung des Tastaturpuffers ist gebraeuchlich.
Dieser belegt bei den CBM's den Bereich von 623 bis 632
(oder eventuell auch weiter). Dies entspricht den Adressen
631 bis 640 des Commodore 64. Die Anzahl qgueltiger Zeichen
wird in Adresse 198 (statt 158 bei den CBM's) festgelegt.
Die Adresse 158 wird auch mit dem WAIT-Befehl angesprochen.
Dies dient dem Programmhalt, bis eine Taste gedrueckt wird.
Das Abschalten der RUNSTOP-Taste wird durch Aendern des In-
halts von 144 erreicht. Beim BASIC 2.0 erfolgt dies durch
den Wert 49 (normal 46) und beim BASIC 4.0 durch den Wert 88
(normal 85). Die entsprechenden Kommandos fuer den 64er sind
"POKE 788, 52" (Abschalten) sowie "POKE 788, 49" (Einschal-
ten).
Weitere Adressbelegungen sind: CBMs 64er
USR-Vektor 0 - 2 784 - 786
Anfang des BASIC-Bereichs 40 - 4] 43 - 44
Anfang der Variablen 42 - 43 45 - 46
Anfang der Arrays 44 - 45 47 - 48
Ende der Variablen 46 - 47 49 - 50
Ende des Arbeitsspeichers 52 - 53 55 - 56
CHRGET-Routine 112 - 135 115 - 138
IRQ-Vektor 144 - 145 788 - 789
Statusvariable ST 150 144
gedrueckte Taste 151 203
Flag fuer SHIFT 152 653
Flag fuer LOAD und VERIFY 157 10 / 147
Anzahl Zeichen im Tastaturpuffer 158 198
Flag fuer Negativdarstellung 159 199
Flag fuer Cursor ein/aus 167 204
Zeiger auf Anfang der Cursorzeile 196 - 197 209 - 210
Cursorspalte 198 211
Flag fuer QUOTE-Modus 205 212
Cursorzeile 216 214
Zaehler fuer INSERT 220 216
Tabelle der MSB's des Bildschirms 224 - 248 217 - 24]
Flag fuer Kontrolle von Tape #1 249 192
Flag fuer Kontrolle von Tape #2 250 192
Tastaturpuffer 623 - 632 631 - 640
l. Cassettenpuffer 634 - 825 828 - 1019
2. Cassettenpuffer 826 - 1017 828 - 1019
116
SPEICHEFRULUFTEILUHNG DES COrmObüOrRE
KERNAL-
ROM-
BEREICH
CHARACTER-
RON-
BEREICH
BEREICH
DER 1.C-
REGISTER
65535
| RANM-
37344 | BEREICH
57343
53248 | BEREICH
53247
ei RAN-
49152 | BEREICH
49151
RAM-
4a98a | BEREICH
EBRSIC-?>
RAN-
BEREICH
£BASIC->
RAM-
BEREICH
CRARTRIDGE-—
ROM-
BEREICH
CARTRIOGE—
ROM-
BEREICH
BRSIC-
ROM-
BEREICH
PROZESSOR-
STRCK
Ext
55313 |COLOR-RAN-
ZEROPRGE-
PROZESSOR-
PORT
117
Jh
MEMORY MAP DES COMMODORE 64
Speicherstellen mit Bezeichnung und dem Zusatz "unbenutzt"
werden geaendert, aber nicht abgefragt oder benutzt.
Adresse
0 :
1 :
2 :
3 - 4:
5 - 6:
7 :
8
9 :
10 :
11 :
12
13 :
14 :
15 :
16 :
17 s
18
19 :
20 - 21:
22 :
23 - 24:
25 - 33:
34 :
34 - 35
36
36 - 37
40 B
40 - 41:
38 - 4]:
42 :
43 - 44;
45 - 46
47 - 48
49 - 50
51 - 52
53 - 54
55 - 56
57 - + 58
58
59
59 - 60
6l - 62
Bedeutung
Datenrichtungsregister des Prozessorports
I/0O-Register des Prozessorports
unbenutzt
45482, Vektor: FLPINT (unbenutzt)
45969, Vektor: INTFLP (unbenutzt)
Suchzeichen/Trennzeichen,
Ziffer beim Lesen von Zeilennummern,
Register zur Ausfuehrung von AND und OR
Suchzeichen/Trennzeichen,
Flag fuer Anfuehrungszeichen,
Register zur Ausfuehrung von AND und OR
Zwischenspeicher fuer Cursorspalte bei TAB
Flag fuer LOAD (=0) und VERIFY (=1) bei BASIC
Laenge der einzufuegenden Programmzeile,
Tabellenzeiger auf BASIC-Worte (Tokenwandlung),
Ausfuehrung von AND (=0) und OR (=255),
Anzahl Dimensionen bei Array-Verwaltung
Flag fuer DIM
Typ des arithmetischen Ausdrucks
(String=255, numerisch=0)
Art der numerischen Variablen
(Integer=128, real=0)
Flag fuer DATA (Umwandlung in Tokens),
Flag fuer Anfuehrungszeichen (LIST),
Flag fuer GARBAGE COLLECT bei Stringeinbau
Flag zum Sperren der Annahme von Integer- und
Feldvariablen (FN und FOR)
Flag fuer INPUT (=0), GET (=64) und READ (=152)
Speicher fuer Operatormaske ("(=)"),
Vorzeichenflag bei trigonometrischen Funktionen
Flag fuer direkte Eingabe/Ausgabe (=0) oder
ueber Filekommando (=fFilenummer)
Zeilennummern und Integervwerte (Adressen)
Zeiger auf Tabelle der Stringdescriptoren
Zeiger auf zuletzt benutzten Stringdescriptor
Tabelle der Stringdescriptoren (String-Stack)
Zeiger in Arrayheader,
Zwischenspeicher fuer Operator
Uebertragungszeiger, Lesen von Zeilennummern,
Zeiger fuer Speicherverschiebungen, Suchzeiger,
Variablenzeiger, Stringzeiger, Sprungvektor
Zwischenspeicher bei NEXT
Zeiger fuer indirekte Speicherung
Laenge eines Feldelementeintrags
Faktor fuer Feldelementberechnung in Array
Ergebnisbereich der Mantisse ("*" und "/")
Rundungsstelle bei Division (unbenutzt)
Zeiger auf Start des BASIC-Programms
Zeiger auf Start der nichtindizierten Variablen
Zeiger auf Start der Feldvariablen
Zeiger auf Ende (plus eins) der Feldvariablen
Zeiger auf Anfang des Stringbereichs
Zeiger fuer Stringuebertragungen
Zeiger auf Ende (plus eins) des BASIC-Speichers
momentane BASIC-Zeilennummer
Flag fuer Direktmodus (=255)
gleich null, falls kein CONT moeglich
Zeilennummer fuer CONT (bei Abbruch)
CHRGET-Pointer auf Befehl (bei CONT)
118
74
73
- 68:
11%
Zeilennummer der momentanen DATA-Zeile
Zeiger auf naechstes Element fuer DATA
Zeiger auf Eingabequelle zur Auswertung
(INPUT, GET, READ)
Variablenname
Zwischenspeicherung (YR) fuer Tabellenzeiger
(Stringerzeugung aus Fliesskomma oder Uhrzeit)
Zeiger auf Variable
Zwischenspeicher fuer Geraetenummer beim Lesen
der LOAD/SAVE/VERIFY-Parameter,
Zwischenspeicher fuer Filenummer beim Lesen der
Fileparameter fuer OPEN und CLOSE,
Zwischenspeicher fuer zweiten WAIT-Parameter
Zwischenspeicher fuer Geraetenummer beim Lesen
der fileparameter fuer OPEN und CLOSE,
Zwischenspeicher fuer dritten WAIT-Parameter
Zeiger auf FOR-NEXT-Variable (fuer Stacksuche),
Zeiger auf Variable bei Zuweisungen
(INPUT, GET, LET, READ)
Zeiger auf Prioritaetsflag in Tabelle,
Flag fuer fehlenden Operator bei Auswertung
Zwischenspeicher fuer CHRGET-Pointer
(INPUT, GET, READ)
Maske fuer Vergleichsoperationen (Auswertung)
Function-Variablenzeiger fuer DEF und FN,
Zeiger in Stringdescriptor bei GARBAGE COLLECT
Zeiger auf Stringdescriptor bei LEFT$, RIGHT$,
MID$, LET, Stringaddition und Transfer von
Strings in den Stringbereich
Fliesskommaregister (Zwischenspeicherung)
(Exponent bei Potenzierung)
Schrittweite fuer GARBAGE COLLECT
Code 76 fuer "JMP"
Zwischenspeicher fuer Schrittweite
(GARBAGE COLLECT),
Zwischenspeicher der Ruecksprungadresse high
(MID$)
Zwischenspeicher fuer Rundungsstelle von FAC
(Addition und EXP)
Sprungvektor fuer Funktionen
Pointer fuer Blocktransfer (Programmzeilen,
Variablen, Arrays),
Pointer in Array fuer GARBAGE COLLECT
Pointer fuer Blocktransfer (Variablen, Arrays,
Programmzeilen, Strings bei GARBAGE COLLECT)
Fliesskommaregister (Zwischenspeicherung)
(Polynomausvertung, TAN)
Anzahl Stellen fuer TI$,
Bitzaehler fuer: 16-Bit-Binaermultiplikation,
Zaehler fuer Anzahl Nachkommastellen (STRFAC),
Dezimalexponent (FACSTR)
Flag fuer Exponentialdarstellung (FAULSTR),
Dezimalexponent (STRFAC),
Flag fuer Dezimalpunkt (STRFAC)
Vorzeichen des Exponenten (STRFAC)
Pointer fuer Blocktransfer,
Startadresse einer Programmzeile,
Pointer fuer Verwaltung von Variablen,
Pointer fuer Stringtransfer (GARBAGE COLLECT)
Fliesskommaregister (Zwischenspeicherung)
(Polynomausvertung)
Exponent von FAC
Stringdescriptor (Stringlaenge, Stringpointer)
Argument zu ON (Ergebnis von GETBYT),
Stringlaenge fuer MID$
119
115
122
"139
144
145
114:
Variablenpointer (Elementauswertung)
Arrayindex (Feldelementberechnung),
Mantisse von FAC (MSB bis LSB, 32 Bits)
Vorzeichen von FAC
Vorzeichen fuer STRFAC,
Zaehler fuer Polynomgrad (Polynomauswertung)
Vorzeichen (Umwandlung FAC in Integerformat)
Exponent von ARG
Pointer auf zweiten String fuer Stringvergleich
Mantisse von ARG (MSB bis LSB, 32 Bits)
Vorzeichen von ARG
verknuepftes Vorzeichen von FAC und ARG
(Flag fuer gleiches Vorzeichen FAC und ARG),
Rundungsstelle von FAC (fuenftes Mantissenbyte)
Stringdescriptorzeiger fuer Uebertragung des
Strings in den Stringbereich,
Pointer auf Descriptor des ersten Strings
(Stringaddition)
Zwischenspeicher fuer Pointer auf codierte
Zeile (Umwandlung von Text in Tokens),
Stellenzaehler fuer Zuweisung an T1$,
Pointer auf erzeugten String (FACSTR)
Pointer auf Tabelle mit Koeffizienten
(Polynomausvwertung),
Pointer fuer Arrayhandling (Elementlaenge,
Feldlaenge, Positionsberechnung fuer Element),
Zwischenspeicher fuer CHRGET-Pointer bei VAL,
Endpointer fuer VUebertragung von Strings in den
Stringbereich
CHRGET-Routine, liest Zeichen aus BASIC-Text
CHRGET-Pointer, zeigt in BASIC-Text;
wird auch zum Auswerten von Eingaben und
aehnlichem auf andere Quellen umgesetzt
(INPUT, GET, READ, FN, VAL)
letzte Zufallszahl bei RND
1/0-Statusbyte fuer Cassette und seriellen Bus
Zwischenspeicher Tastaturausgang fuer RUNSTOP
und Abfrage der Commodore-Taste bei Tape-Read
Die Angaben "Read" und "Write" beziehen sich auf die
Verwendung dieser Adressen bei den Recorderoperation!
146
Korrekturflag zur Anpassung der Timing-
Konstanten bei Gleichlaufschwankungen (Read)
Flag fuer LOAD (=0) und VERIFY (=1) fuer KERNAL
Flag fuer "Zeichen gepuffert" bei seriellem Bus
serielles Register fuer Ausgabe von Daten
(serieller Bus)
sovie Puffer fuer letztes Byte (EOI)
Flag fuer "End of Block empfangen" (Read)
Zwischenspeicher. fuer Indexregister beim Holen
von einzelnen Zeichen (GETIN)
Anzahl an geoeffneten logischen Files
(Zeiger in Tabelle der Fileparameter)
aktives Eingabegeraet, normalerweise Tastatur
aktives Ausgabegeraet, normalerweise Bildschirm
Register zur Bestimmung des Paritybits von
Datenbytes (Read/Write)
Flag fuer "Byte empfangen" (Read)
Flag fuer Ausgabemodus fuer Betriebssystem-
meldungen (siehe Beschreibung Systemroutinen),
Festlegung fuer Direktmodus und Programmodus
120
158
159
160
163
164
165
166
167
168
169
171
172
Zwischenspeicher fuer Kennzeichnung des Datei-
typs, Pointer auf Filenamen bei Uebertragung
des Filenamens (beides beim Erzeugen des Datei-
kopfs fuer Tape-Write),
Zaehler fuer Anzahl Lesefehler mal zwei fuer
Pointer in Adressentabelle im Stack fuer
Fehlerkorrektur (Read)
Pointer auf Filenamen in Dateikopf bei Ueber-
tragung des Filenamens (Erzeugung des Datei-
kopfs fuer Tape-Write),
Korrekturzaehler fuer Pass2 beim Lesen von Band
(Pointer auf Adressentabelle im Stack, Read)
interne (softwaremaessig realisierte) Uhr
(TI, TI$, Reihenfolge MSB bis LSB!)
EOI-Flag bei Ausgabe auf seriellen Bus,
Bitzaehler fuer Lesen von Datenbytes (Read)
serielles Register fuer Empfang von Daten vom
seriellen Bus, Flag fuer Empfang/Ausgabe beider
Impulse, die ein Datenbit festlegen,
Impulszaehlung (Read/Write)
Zaehler fuer acht Bits bei Ausgabe/Empfang von
Daten ueber seriellen Bus, Flag fuer EOI (=0)
und Zeitfehler (=1) bei Timeout (serieller Bus)
Zaehler fuer Synchronisationsbytes
(Zaehlung, Write)
Pointer in Cassettenpuffer fuer Filehandling
Anzahl noch zu lesende Blocks (Read),
Zaehler fuer Dauer der Shorts (Write),
Zwischenspeicher fuer empfangenes Bit (RS-232)
Flag fuer Lesefehler eines Bits und Parityerror
(Read),
Flag fuer "Byte-Impuls geschrieben" (Write),
Bitzaehler fuer Empfang von Bytes (RS-232)
Flag fuer Impulslaengenvechsel zur Erkennung
von Bit-Lesefehlern (Read),
Flag fuer "Long-Impuls (nach "Byte"-Impuls)
geschrieben" (Write),
Flag fuer Empfang des Startbits (RS-232)
Flag fuer Synchronisationszaehlung (=1 bis 9),
Abtastung (=0), Lesen (=64) und Ende (=128),
serielles Shiftregister fuer Empfang von Daten
(RS-232)
Register zur Errechnung der Puffer-Pruefsumme
(Checksum, Read), Laenge des Headers (Write),
Register zur Errechnung der Parity beim Empfang
von Daten (RS-232)
Transportzeiger fuer Tape und SAVE auf seriel-
lem Bus, Pointer fuer Scrolling (Videomatrix,
Quellzeile)
Endadresse fuer Write/SAVE (Programm), Pointer
fuer Scrolling (Colornybbles, Quellzeile),
Transportzeiger fuer LOAD*-von Diskette
Timing-Konstante zur Anpassung der Lese-
geschwindigkeit, Korrektur durch (146) (Read)
vergangene Zeit seit letzter negativer Flanke
(Read)
Pointer auf Startadresse des Recorderpuffers
Freigabeflag fuer TimerA (Tape Read),
BitZaenlelr fuer Ausgabe von Bytes (RS-232)
Flag fuer "qgueltiges EOB empfangen" (Read),
naechstes zu sendendes Bit (RS-232)
Flag fuer Lesefehler des Bytes (Tape Read)
und Vergleichsfehler (VERIFY);
Flag fuer "Block geschrieben" (Tape Write),
serielles Shiftregister zur Ausgabe von Daten
(RS-232)
121
209
212
213
214
215
216
217
242
243
245
247
249
251
241:
244:
246:
248:
250:
254:
Laenge des Filenamens
aktuelle logische Filenummer
aktuelle Sekundaeradresse
aktuelle Geraetenummer
Pointer auf Filenamen
Register fuer gelesenes Byte sowie Checksum
beim Lesen (letztes gelesenes Byte, Read),
serielles Bit-Shiftregister (Write),
Register zur Bestimmung der Parity bei der
Ausgabe von Daten (RS-232)
Zaehler fuer Anzahl noch zu verarbeitender
Blocks (Read),
Anzahl noch zu schreibende Blocks (Write)
serielles Shiftregister zum Lesen von Bytes
(Tape Read)
Motorkontrolle zum Anhalten des Recordermotors
Pufferstartadresse, Programmstartadresse
(SAVE, Tape Read/Write), Pointer fuer RAM-Test
Startadresse (Appendadresse) bei LOAD (KERNAL),
Uebertragungszeiger fuer Vektortabelle
Tastaturmatrixcode aus vorherigem Aufruf der
Tastaturabfrage (SCNKEY)
Anzahl qgueltige Zeichen im Tastaturpuffer
Flag fuer Negativdarstellung (RVS5)
Pointer auf letztes Zeichen (ungleich Space) in
Bildschirmzeile beim Lesen der Eingabezeile
Cursorzeile bei Aufruf von CHRIN,
Flag fuer Cursorzeilenvechsel bei Eingabe
Cursorspalte bei Aufruf von CHRIN
Tastaturmatrixcode aus SCNKEY-Aufruf,
Pointer in Decodierungstabelle fuer Tastatur
Flag fuer Cursor ein (=0) und aus
Zaehler fuer Cursorblinkdauer
Zeichen unter Cursor, falls Cursor hell
Flag fuer Cursor hell/dunkel (wenn (204) = 0)
Flag fuer letztes Zeichen beim Lesen von
Zeichen vom Bildschirm, Flag fuer "RETURN"
Pointer auf Anfang der Cursorzeile im
Bildschirm-RAM, Zielpointer fuer Scroll
Cursorspalte innerhalb der Cursorzeile,
Indirect-Pointer zu (209/210)
Flag fuer Anfuehrungszeichen (Quote-Modus)
Laenge der aktuellen Cursorzeile (39 oder 79)
Nummer der Cursorzeile (O0 bis 24)
Register fuer gelesenes Bit (Tape Read),
Puffer-Pruefsumme (Tape Write),
Zwischenspeicher fuer Zeichencode sowohl bei
Umwandlung von ASCII in Bildschirmcode als
auch umgekehrt (bei Ausgabe von Zeichen und
beim Lesen von Zeichen vom Bildschirm)
Insertzaehler, Anzahl noch ausstehender Inserts
Tabelle der Doppelzeilenkennzeichnungen,
Bit O und Bit 1 enthalten die Page# innerhalb
der Videomatrix; ist Bit 7 geloescht, so
handelt es sich um eine Fortsetzungszeile
Einfachzeilenkennzeichnung der "26. Zeile"
(falls auf Fortsetzungszeile zur letzten Bild-
schirmzeile zugegriffen wird)
Pointer auf Anfang der Cursorzeile im
RAM der Colornybbles, Zielpointer der Farbcodes
fuer Scroll
Pointer auf Decodierungstabelle fuer Tastatur-
abfrage (SCNKEY)
Zeiger auf Beginn des Empfangspuffers (RS-232)
Zeiger auf Beginn des Sendepuffers (RS-232)
unbenutzt
122
255 - 271: Puffer fuer Zahlenumwandlungen von Fliesskomma
in Strings sowie fuer Erzeugung von TI1$
256 - 379: Puffer fuer Fehlerkorrektur beim Lesen von Band
(enthaelt Adressen der fehlerhaften Bytes)
256 - 511: Hardwarestack des Prozessors, wird ausser der
normalen Funktion des Stacks auch zur
Speicherung von Daten fuer GOSUB und
FOR-NEXT-Schleifen verwendet
508 - 511: Speicher fuer Zeilennummer und Pseudolink fuer
Einbau von Programmzeilen in BASIC-Text
512 - 600: BASIC-Eingabepuffer, wird verwendet fuer INPUT,
GET (jeweils auch fuer Filehandling), Puffer
fuer Eingabe von Zeilen, Umwandlung in Tokens
"601 - 610: Tabelle der Filenummern
611 - 620: Tabelle der Geraetenummern
621 - 630: Tabelle der Sekundaeradressen
631 - 640: Tastaturpuffer
641 - 642: MEMBOT, Speicherbeginn fuer BASIC
643 - 644: MEMTOP, Speicherende fuer BASIC
645 : Timeout-Flag fuer seriellen Bus (unbenutzt)
646 : Cursorfarbe (Druckfarbe fuer Zeichenausgabe)
647 : Farbe unter Cursor, falls Cursor hell
648 : Startpage der Videomatrix
649 : maximale Groesse des Tastaturpuffers
(maximale Anzahl Zeichen im Tastaturpuffer)
650 : Flag fuer REPEAT:
Bit 7 gesetzt: REPEAT fuer alle Tasten
Bit 6 gesetzt: REPEAT fuer keine Taste
sonst nur fuer Cursorsteuerung und SPACE
Bit 7 hat Prioritaet vor Bit 6
651 : Zaehler der Wiederholungszeit fuer REPEAT
(Geschwindigkeit)
652 : Zahler der Anspruchszeit fuer REPEAT
(Verzoegerung)
653 : Flag fuer Kombinationstasten:
Bit 0: Shift
Bit 1: Commodore
Bit 2: Control
das entsprechende Bit ist gesetzt, wenn die
Taste gedrueckt ist
654 : Kopie von (653) fuer Abfrage, ob Commodore-
und Shift-Taste schon beim letzten Aufruf
gedrueckt waren (fuer Umschaltung von Graphik
und Text)
655 - 656: Sprungvektor fuer Tastaturabfrage
(kann zum Beispiel verwendet werden, um die
Funktionstasten zu belegen)
657 : Flag fuer Blockierung der Umschaltung von Text
und Graphik durch die Shift- und Commodore-
Taste (durch CHR$(8) und CHR$(9))
658 : Insert Enable, dient zur Erkennung, ob beim
Ueberschreiten einer Einfachzeile eine
Leerzeile eingefuegt (Editiermodus) oder die
Zeile weberschrieben werden soll (Ausgabe von
Zeichen durch Programm (PRINT))
659 : Kontrollregister (RS-232)
660 : Kommandoregister (RS-232)
661 - 662: Wert fuer Baud-Rate aus Tabelle (RS-232)
663 : RS-232 Statusbyte
664 : Wortlaenge (RS-232)
665 - 666: Wert fuer Timer beim Senden (RS-232)
667 : Zeiger auf Ende des Empfangspuffers
668 : Zeiger auf naechstes Zeichen im RS-232-
Empfangspuffer
669 : Zeiger auf zu uwebertragendes Byte im
Sendepuffer
123
670 : Zeiger auf naechste freie Stelle im Sendepuffer
671 - 672: Zwischenspeicher des IRQ-Vektors waehrend
Cassettenoperationen
673 :: Flagregister fuer aktive RS-232-NMIs
674 : Wert fuer CRA (IRQ-CIA) fuer Neustart von
Timer A beim Lesen von Cassette
675 : Wert des Interrupt Flag Registers (Tape Read)
676 : Flag fuer "Timer A abgelaufen"
(Underflow, Tape Read)
677 : Nummer der Fortsetzungszeile beim Erweitern
einer Einfachzeile (Scroll)
678 : Flag fuer Quarzfrequenz der verschiedenen
Versionen des Commodore 64
679 - 767: unbenutzt
768 - 1769: 58251, Vektor: Ausgabe von Fehlermeldungen
770 - 771: 42115, Vektor: Eingabewarteschleife nach READY.
772 - 773: 42364, Vektor: Umwandlung Klartext in Tokens
774 - 775: 42778, Vektor: Umwandlung Tokens in Klartext
716 - 777: 42980, Vektor: Routinenaufruf (Interpreter)
778 - 779: 44678, Vektor: Elementauswertung (FRMEVL)
780 : Vebergabevert bei SYS-Befehl (Accu)
781 : Vebergabevwert bei SYS-Befehl (XR)
782 : Vebergabevert bei SYS-Befehl (YR)
783 : Vebergabevwert bei SYS-Befehl (Statusregister)
784 : Code 76 fuer "JMP"
785 - 786: 45640, USR-Vektor
787 unbenutzt
788 - 789: 59953, IRQ-Vektor
790 - 791: 65126, BRK-Vektor
792 - 793: 65095, NMI-Vektor
794 - 7195: 62282, OPEN-Vektor
796 - 797: 62097, CLOSE-Vektor
798 - 799: 61966, CHKIN-Vektor
800 - 801: 62032, CHKOUT-Vektor
802 - 803: 62259, CLRCHN-Vektor
804 - 805: 61783, CHRIN-Vektor
806 - 807: 61898, CHROUT-Vektor
808 - 809: 63213, STOP-Vektor
810 - 811: 61758, GETIN-Vektor
812 - 813: 62255, CLALL-Vektor
814 - 815: 65126, unbenutzt
8l& - 817: 62629, LOAD-Vektor
818 - 819: 62957, SAVE-Vektor
820 - 827: unbenutzt
828 - 1019: Cassettenpuffer
1020 - 1023: unbenutzt
Unterschiede in der Speicherbelegung des VIC-20:
Der USR-Vektor (zusammen mit JMP-Code) belegt die Adressen 0
bis 2 anstelle der Adressen 784 bis 786, der Prozessorport
entfaellt.
Adressen 673 bis 678 sind beim VIC-20 unbenutzt.
»
Die Tabelle der Doppelzeilenkennzeichnungen belegt nur den
Bereich von 217 bis 239 (da nur 23 Bildschirmzeilen). Adres-
se 240 erfuellt dadurch die Funktion der Adresse 242 des
Commodore 64. Adresse 24] wird (wie 243 beim Commodore 64)
beim Loeschen des Bildschirms gesetzt, jedoch in keinem Zu-
sammenhang damit benutzt. Vermutlich sollte der Speiche-
rungsbefehl an die Adressen fuer die "24." bzw. "26." Zeile
gehen, diese werden jedoch schon vorher initialisiert.
Adresse 242 stand beim VIC-20 noch frei und hat die Funktion
von (677) des Commodore 64.
124
DER PROZESSOR 6510/SPEICHERVERWALTUNG DES COMMODORE 64
Im Gegensatz zu den vorherigen Computermodellen von Commodo-
re verfuegt der Commodore 64 nicht ueber eine 6502 als Pro-
zessor, sondern eine 6510. Auf die Unterschiede und Beson-
derheiten, die sich daraus ergeben, soll im folgenden einge-
gangen werden.
Diese 6510 verfuegt ueber den gleichen Befehlssatz wie die
6502 auch und ist daher vollkommen softwarekompatibel. Die
Taktfrequenz betraegt nicht genau ein Megahertz - vie zum
Beispiel bei den CBMs - sondern etwas weniger (oder bei den
Geraeten, die fuer die Fernsehnorm NTSC ausgelegt sind, et-
was mehr) als ein MHz. Die genauen Angaben finden sich bei
der Erklaerung der Systemroutinen. Der einzige wirkliche Un-
terschied besteht darin, dass sie zusaetzlich ueber einen
1/0-Port, bestehend aus sechs Leitungen, veruegt. Jede Lei-
tung dieses Ports laesst sich getrennt als Eingang oder Aus-
gang schalten. Dieser Port wird beim Commodore 64 zur Steue-
rung des Recorders und der Speicherverwaltung verwendet. Das
besondere an diesem I/O-Port (Prozessorport genannt) ist,
dass sich Datenrichtungsregister und Ausgaberegister in der
Zero-Page befinden:
Adresse O: DATA DIRECTION REGISTER
Adresse 1: OUTPUT REGISTER
Diese beiden Speicherstellen stehen daher nicht mehr fuer
die Datenspeicherung zur Verfuegung (weswegen auch der, USR-
Vektor verlegt werden musste). Allerdings koennen nun sechs
Steuerleitungen durch die .Zero-Page-Adressierung erreicht
werden. Diese Steuerleitungen werden ueber die Bits 0 bis 5
(Bits 6 und 7 sind als Portleitungen nicht vorhanden) kon-
trolliert und haben folgende Bedeutungen: :
Bit O0: (Output) LORAM, Kontrolleitung fuer Speicherbelegung
Bit 1: (Output) HIRAM, Kontrolleitung fuer Speicherbelegung
Bit 2: (Output) CHAREN, Ein-/Ausblenden des Zeichengenerator
Bit 3: (Output) Schreibleitung fuer Recorderoperationen
Bit 4: (Input) Feststellung, ob Recordertaste gedrueckt ist
Bit 5: (Output) Ein- und Ausschalten des Recordermotors
Die Kontrolle ueber die Funktion einer Datenleitung als Ein-
gang oder Ausgang erfolgt wie in allen anderen Faellen auch:
Das entsprechende Bit in Adresse 0 (Datenrichtungsregister)
muss gesetzt werden, wenn diese Portleitung als Ausgang pro-
grammiert werden soll. Die Funktion als Eingang erhaelt die
Leitung, wenn das zugehoerige Bit des Datenrichtungsregi-
sters geloescht ist. Die Umprogrammierung ist jedoch beim
Commodore 64 meist sinnlos, da der gesamte Prozessorport be-
reits durch das Betriebssystem und durch die Hardware fest-
gelegte Funktionen erfuellt.
Die Bits 3 bis 5 werden fuer Recorderoperationen verwendet.
Bit 3 dient dazu, Impulse auf Band zu schreiben (siehe ROM-
Listing, Adresse 64422 ff). Bit 4 ist geloescht, wenn eine
Recordertaste (ausser REC und STOP) gedrueckt ist, ansonsten
gesetzt (auch, wenn kein Recorder angeschlossen ist). Bit 5
dient der Recordermotorkontrolle. Soll der Motor eingeschal-
tet werden, so muss dieses Bit geloescht werden. Das Anhal-
ten erfolgt entsprechend durch Setzen von Bit 5. Erfolgt
dies allerdings bei zugelassenem Interrupt (also zum Bei-
spiel im Normalfall von BASIC aus), so muss ausserdem Adres-
se 192 auf einen Wert ungleich null gesetzt werden, da an-
sonsten bei gedrueckter PLAY-Taste der Recordermotor nicht
angehalten werden kann.
125
Das Speicherverwaltungskonzept des Commodore 64
Der Commodore 64 verfuegt, was in der Werbung auch gross an-
gepriesen wird, ueber 64 Kilobytes an RAM, 20 Kilobytes ROM
und ansonsten auch noch ueber einige Bausteine, die geson-
derte Funktionen uebernehmen. Nur hat dies alles einen Ha-
ken, der jedem, der sich schon ein wenig mit der Architektur
der 65xx CPUs beschaeftigt hat, sofort auffallen muesste:
ein Prozessor mit einem Adressbus von sechzehn Bits kann nur
64 Kilobytes adressieren. Egal, wie man es dreht und wendet,
irgendwo ist etwas zuviel. Und fuer denjenigen, der "nur" in
reinem BASIC (ohne maschinennahe Befehle wie POKE oder PEEK)
programmiert, sind dies leider 26 KB, die von den verspro-
chenen 64 KB fehlen, da beim Einschalten nur 38 KB als frei
verfuegbar gemeldet werden. Von den 64 KB gehen natuerlich
erst einmal 2 KB fuer Bildschirm (von 1024 bis 2047) und
Systemspeicher (von O bis 1023) ab. Ausserdem stehen, wie
dies aus Speicheruebersichten bekannt ist, noch weitere 4 KB
im Bereich von 49152 bis 53247 zur Verfuegung, von denen man
als BASIC-Programmierer zwar selten etwas hat, aber man
weiss immerhin, dass sie vorhanden sind. Bleiben also 20 KB,
was genau dem Umfang des uebrigen Speichers entspricht.
Dieser ist zum Beispiel von zwei Betriebssystem-ROMs zu je B
KB belegt (auch hier "fehlen" 4 KB an den 20 KB ROM). Die
restlichen 4 KB des adressierbaren Speicherbereichs (von
53248 bis 57343) der 6510 wird vom LI/O-Bereich, bei dem
- vie bisher immer - sehr grosszuegig mit der Adressdecodie-
rung vorgegangen wurde, sodass saemtliche Register sich
ueber einige Adressen ansprechen lassen, belegt.
Die restlichen 20 KB an RAM liegen "parallel" oder "unter"
dem Bereich, der von 1/0 und ROM eingenommen wird. Fuer
BASIC-Programme oder Variablen laesst sich dieser Bereich
normalerweise nicht nutzen, jedoch durchaus fuer zum Bei-
spiel Daten von hochaufloesenden Graphiken. Das Problem be-
steht nur darin: Wie erreicht man diesen RAM-Bereich? Dazu
erst einmal eine kurze Zusammenfassung:
Die 64 KB an RAM fuellen den gesamten Adressbereich des Pro-
zessors von DO bis 65535. Da jedoch beim Einschalten des Ge-
raets BASIC vorhanden sein muss, werden zwei BASIC-ROMs (im
Bereich von 40960 bis 49151 und 57344 bis 65535) "ueber" das
RAM gelegt, sodass fuer den Prozessor dieses RAM nicht mehr
existiert, sondern nur noch der ROM. Ausserdem befinden sich
im Adressbereich von 53248 bis 57343 die Register von Bau-
steinen, die fuer die Kommunikation mit der Aussenvelt sor-
gen. Auch das RAM in diesem Gebiet ist fuer den Prozessor
nicht vorhanden. Lediglich im Bereich von 2 bis 40959 (sowie
von 49152 bis 53247) ist RAM benutzbar.
Es muss jedoch Moeglichkeiten geben, sich diesen Bereich
nutzbar zu machen. Fuer die Steuerung der Bereichsverteilung
existieren daher (von einer Anzahl weiterer Leitungen, die
fuer den Programmierer jedoch nicht erreichbar sind, abgese-
hen) hauptsaechlich fuenf Kontrolleitungen, die den Spei-
cheraufbau regeln. Dies sind folgende ...
LORAM : Bit 0 des Prozessorports
HIRAM : Bit 1 des Prozessorports
CHAREN: Bit 2 des Prozessorports
EXROM : Anschluss 9 des Cartridge Expansion Ports
GAME : Anschluss 8 des Cartridge Expansion Ports
126
Wie ersichtlich, sind nur die ersten drei Leitungen soft-
varemaessig zu aendern, die letzteren dienen der Kontrolle
von Einschubmodulen wie BASIC-Erweiterungen sovie Spielen,
die zum Beispiel fuer den Ultimax (VC-10) gedacht sind.
Alle fuenf Leitungen sind "active low', sodass ihnen der
Wert null zur Ausuebung ihrer Funktion zugewiesen werden
muss (entsprechend gegen Masse gelegt).
Zuerst soll auf die alleinige Wirkung von LORAM in Form ei-
nes Beispiels eingegangen werden. LORAM steuert den Bereich
von 40960 bis 49151. Dieser enthaelt im Normalfall den
BASIC-ROM. Allerdings ist dieser ROM, wie andere Bereiche
auch, von RAM "unterlegt". Wird LORAM jetzt durch ...
POKE 1, PEEK (1) AND 254
... der Wert null zugewiesen, so wird dieses ROM durch den
entsprechenden RAM-Bereich ausgetauscht. Somit befindet sich
nun das BASIC-ROM nicht mehr in dem durch den Prozessor er-
reichbaren Adressbereich, dafuer ist nun RAM vorhanden. Der
obige Befehl darf natuerlich nicht einfach so eingegeben
werden. Schliesslich benoetigt man ja den BASIC-ROM. Wird
dies trotzdem getan, so saegt man vergleichsweise an dem
Ast, auf dem man selbst sitzt, da dieser Befehl zu einem Ab-
sturz des Computers fuehrt, im guenstigsten Fall wird ein
BASIC-Warmstart ausgefuehrt.
Nun eine weitere Eigenschaft dieses WUeberlappungsprinzips:
jegliche SCHREIB-Befehle, die in einen Bereich zielen, in
dem sich ROM befindet, werden in den fuer den Prozessor
nicht lesbaren RAM-Bereich "umgelenkt". Wird also ...
POKE 40960, 255
... eingegeben, so wird dieser POKE-Befehl nicht an den
BASIC-ROM weitergeleitet. Dies haette auch wenig Sinn, da
sich ein ROM ja gerade durch die Eigenschaft auszeichnet,
seinen Inhalt beizubehalten. Stattdessen wird nun die Adres-
se 40960 des sich "unter" dem ROM befindlichen RAMs mit dem
Wert 255 beschrieben. Man kann daher den gesamten RAM-Be-
reich, "üeber" dem sich ROM befindet (also weitere 16 KB der
noch fehlenden 20 KB an RAM), aendern, jedoch (noch) nicht
lesen. Somit hat die folgende Befehlszeile ...
FOR I = 40960 TO 49151 : POKE I, PEEK (I) : NEXT
.. durchaus einen Sinn, wenn es auch auf den ersten Blick
sinnlos erscheint, in eine Adresse den Wert zu schreiben,
der sich doch sowieso schon darin befindet. Inzwischen. wis-'
sen Sie jedoch, dass durch diese Befehlszeile der Inhalt des
BASIC-ROMs, das sich momentan in diesem Bereich befindet, in
das "darunterliegende" RAM kopiert wird. ROM und RAM dieses
Bereichs sind nun also identisch (allerdings sollte darauf
hingewiesen werden, dass gerade im Umgang mit Peripheriebau-
steinen es vorkommen kann, dass ein Wert in ein Register ge-
speichert wird, der sich schon darin befindet). Jetzt hin-
dert uns auch nichts mehr daran, das BASIC-ROM durch das RAM
auszutauschen. Geben Sie doch nun doch einmal "POKE 1, PEEK
(1) AND 254" ein. Auch wenn sich scheinbar nichts aendert,
so ist nun das BASIC-ROM fuer den Prozessor nicht mehr vor-
handen. Alle Daten, die sonst aus dem BASIC-ROM geholt wver-
den, alle Programmsequenzen, die normalerweise im BASIC-ROM
ablaufen, all dies geschieht nun im RAM, das nun ueber den
BASIC-ROM hinueber gehoben wurde (beim Ausprobieren sollten
uebrigens eventuelle Erweiterungen entfernt werden).
127
Was laesst sich nun damit anfangen? Haben Sie sich noch
nicht ueberlegt, was man im Betriebssystem alles aendern
koennte. Geben Sie doch einfach einmal ...
POKE 41853, 32
... ein. Das Wort "READY." erscheint ploetzlich ohne den
Punkt (ueber den Sinn dieser Aenderung kann man natuerlich
geteilter Meinung sein). Schauen Sie am besten einmal im
ROM-Listing nach. Es koennen nun deutsche Fehlermeldungen
kreiert werden, sogar deutsche Befehlsworte sind theoretisch
moeglich (aber wohl nicht unbedingt sinnvoll). Auch das Pro-
gramm fuer die Abfrage der Echtzeituhr (siehe Beschreibung
der CIA, Time of Day) kann in den Bereich fuer BASIC direkt
hineingeschrieben werden. Allerdings sollten nicht solche
Teile geaendert werden, die waehrend des Aenderungsvorgangs
aufgerufen werden. Dazu sollte man erst zurueckschalten
(auch durch RUNSTOP/RESTORE moeglich).
Beim Commodore 64 existieren nun noch weitere drei Bereiche,
die verschiedene Inhalte haben koennen, je nach Zustand der
Kontrolleitungen. Dies sind folgende:
Der Bereich von 57344 bis 65535 enthaelt im Normalfall den
KERNAL-ROM (dient zur Bearbeitung von hardwareabhaengigen
Dingen). Die zweite Moeglichkeit fuer diesen Bereich ist die
Belegung dieses Bereichs mit RAM.
Der zweite aenderbare Bereich ist der von 53248 bis 57343.
Hier existieren gar drei Moeglichkeiten. Zuerst ist dies die
Verwendung dieses Bereichs als I/O-Bereich. Hier befinden
sich die Register der CIAs, des VIC-II-Chips und des Sound-
bausteins. Die zweite Moeglichkeit besteht im Einblenden des
Zeichengenerators, was Ihnen vielleicht aus dem Kapitel der
Zeichendefinierung noch bekannt ist. Der Zeichengenerator,
normalerweise fuer den Prozessor nicht erreichbar, kann den
1/0-Bereich ersetzen und dann (fuer Aenderungen) ausgelesen
verden. Als letzte Moeglichkeit existiert natuerlich auch
hier die der Belegung dieses Bereichs mit RAM.
Zum dritten Bereich muss nicht viel gesagt werden. Es ist
der Adressbereich von 40960 bis 49151, der zuvor als Bei-
spiel diente. Er enthaelt entweder den BASIC-ROM, natuerlich
RAM oder auch den Inhalt eines Cartridges, das in den Erwei-
terungsport gesteckt wurde.
Ausserdem existiert noch der Bereich von 32768 bis 40959: Er
enthaelt, wenn kein Erweiterungsmodul gesteckt wurde, RAM,
das von BASIC aus verwendet werden kann. Ausserdem kann es
den Inhalt eines Cartridge-R0OMs enthalten (zum Beispiel
EXBASIC), wodurch aber acht Kilobytes an RAM nicht mehr ver-
fuegbar sind.
Nun eine genau Uebersicht, welche Leitungen welche Zustaende
einnehmen muessen, um eine gewuenschte Speicherbelegung zu
erreichen (nicht alle theoretisch moeglichen Kombinationen
sind auch erreichbar). Die Leitung CHAREN wird hier ausser
acht gelassen, sie wird anschliessend erlaeutert.
>7344-65535: RAM : HIRAM
KERNAL: HIRAM
0
l
Soll also der Bereich der oberen B KB mit RAM belegt sein,
so loeschen Sie einfach Bit ] des Prozessorports. Entspre-
chend setzen Sie Bit 1], wenn das KERNAL-ROM erreichbar sein
soll.
128
53248-57343: RAM : LORAM = O und HIRAM = 0
1/0 : LORAM = 1] oder HIRAM = 1
Ist also im Bereich von 57344 bis 65535 KERNAL ausgewaehlt
worden, so kann hier nicht RAM erreicht werden, da hierzu
sowohl LORAM, als auch HIRAM geloescht sein muessen, was
aber nicht moeglich ist, da ansonsten im obigen Bereich
KERNAL nicht sichtbar waere. Im folgenden Bereich wird es
etwas komplizierter:
40960-49151: RAM : HIRAM = O0 oder
(HIRAM = 1 und LORAM = DO)
BASIC : LORAM = und HIRAM = 1 und GAME
1 l
MODUL : HIRAM l und GAME = O0 und EXROM
0
Auch hier ergibt sich zum Beispiel die Einschraenkung, dass
kein BASIC verfuegbar sein kann, wenn nicht zusaetzlich im
oberen Bereich KERNAL verfuegbar ist (umgekehrt ist dies je-
doch durchaus moeglich und sinnvoll).
32768-40959: RAM : HIRAM = O0 oder LORAM = O oder
(saemtliche vier Leitungen gesetzt)
MODUL : HIRAM = 1 und LORAM = 1 und EXROM = OD
Zusaetzlich existiert noch die Kombination "GAME = 0 und
EXROM = 1" (restliche Leitungen bleiben unbeachtet), die
verwendet wird, wenn Module fuer den ULTIMAX auf dem Commo-
dore 64 ablaufen sollen. Von dieser Kombination wird hier
jedoch abgesehen.
Anhand der obigen Angaben sollen nun die Leitungszustaende
fuer eine gegebene Speicheraufteilung erarbeitet werden:
KERNAL soll verfuegbar sein, ebenso der normale I/O-Bereich.
Allerdings soll das gesamte Gebiet von 32768 bis 49151 durch
ein im Cartridge vorhandenes ROM belegt sein. Die Vorgehens-
weise:
HIRAM muss gesetzt werden, da KERNAL verfuegbar sein soll.
1/0 ist automatisch auch verfuegbar, wenn HIRAM gesetzt ist.
LORAM ist daher (bisher) beliebig setzbar. Zusaetzlich mues-
sen nun auch noch GAME und EXROM geloescht sein, da HIRAM =
l, GAME = DO und EXROM = O0 sein muessen, um im Bereich von
40960 bis 49151 ein Cartridge einzublenden. Um nun auch im
darunterliegenden Bereich auf den Modulinhalt zugreifen zu
koennen, muss also noch LORAM gesetzt werden. Die endguelti-
ge Verteilung ist also ...
LORAM = 1], HIRAM = ], GAME = 0, EXROM = O0
Genauso muss bei anderen Speicherverteilungen vorgegangen
werden. Sollten notwendige Bedingungen fuer diese Aufteilun-
gen sich widersprechen (zum Beispiel die Bedingung CARTRIDGE
in einem Bereich und RAM im Bereich von 57344 bis 65535), so
ist diese Kombination nicht moeglich und wohl auch in den
meisten Faellen nicht sinnvoll.
Nun zur Bedeutung der Leitung CHAREN: Sie tauscht den Zei-
chengenerator (das sind uebrigens die vorhin noch als "feh-
lend" bezeichneten 4 KB der 20 KB ROM) gegen den 1/0-Bereich
aus. Soll der Zeichengenerator also ausgelesen werden, so
muss dieses Bit geloescht werden. Die genaue Vorgehensveise
ist bei der Definition eigener Zeichen (Video Interface
Chip) dargelegt. Befindet sich momentan in diesem Bereich
kein 1/0, sondern RAM, so kann der Zeichengenerator NICHT
ausgelesen werden, da dieser nur gegen 1/0, nicht aber gegen
RAM ausgetauscht werden kann.
129
Um nun mit dem gesamten RAM arbeiten zu koennen, muss also
sowohl darauf schreibend, als auch lesend zugegriffen werden
koennen. Schreibend ist dies, sofern das RAM mit ROM wueber-
legt ist, durch POKE (oder durch die Aequivalente der
Maschinensprache) moeglich. Nur das Lesen kann nicht auf
diese Weise erfolgen. Es bietet sich also an, eine Art PEEK
Befehl, der nur auf RAM wirkt, zu konstruieren.
Dies ist durch Verwendung der USR-Funktion problemlos moeg-
lich: Zuerst das Maschinenprogramm (als Bereich wurde hier
der Cassettenpuffer gewaehlt) mit den Erlaeuterungen (siehe
auch ROM-Listing von 47117 bis 47139):
828 LDA 2] (20/21) fuer weitere Verwendungen auf
830 PHA den Stack retten (POKE und WAIT)
831 LDA 20
833 PHA
834 JISR 47095 > GETADR wertet Argument zu USR aus
837 LDA 1 Inhalt des Prozessorports
839 PHA auf Stack legen
840 AND #252 Bits O (LORAM) und 1 (HIRAM) loeschen
842 SEI Interrupt verhindern (!!!)
843 STA 1 neue Speicherverteilung festsetzen
845 LDY #0
847 LDA (20),Y Zeichen aus RAM lesen
849 TAY und ins YR uebertragen
850 PLA vorherigen Inhalt des
851 STA 1 Prozessorports wiederherstellen
853 CLI Interrupts wieder zulassen
854 PLA
855 STA ‚20
857 PLA Pointer in (20/21) wiederherstellen
858 STA 21
860 JMP 45986 >) Accu := 0, INTFLP
Nun kann durch USR jede Adresse der 64 KB RAM gelesen wer-
den, und das von BASIC aus. So kann zum Beispiel eine hoch-
aufloesende Graphik (bei deren Erstellung ja, vie zum Bei-
spiel die Sinuskurve bei der £Erklaerung des VIC-II-Chips,
auch lesend auf den Bit-Map-Bereich zugegriffen werden muss)
der Speicherbereich unter den Betriebssystem-ROMs verwendet
werden, der ansonsten fuer BASIC brachliegt.
Und hier der zugehoerige BASIC-Loader:
100 DATA 165, 21, 72, 165, 20, 72, 32, 247, 183, 165, 1, 72
110 DATA 4l, 252, 120, 133, 1, 160, , 177, 20, 168, 104, 133
120 DATA 1, 88, 104, 133, 20, 104, 133, 21, 76, 162, 179
130 FOR I = 828 TO 862 : READ A : POKE I, A : NEXT
140 POKE 785, 60 : POKE 786, 3
Um die Sinuskurve aus der Erklaerung des Video-Chips nun im
Bereich der hinteren acht Kilobytes abzulegen, muss zuerst
obiges Programm eingegeben und gestartet werden. Danach kann
es durch "NEW" geloescht werden, da sich das Maschinenpro-
gramm im Bereich von 828 bis 862 befindet. Geben Sie dann
folgendes Programm ein:
130
200
210
220
230
240
250
260
270
280
290
300
POKE 56576,
FOR I =
FOR I =
POKE 53272,
POKE 53265,
FOR X =
B =:
POKE B,
GET G$ :
POKE 56576,
POKE 53272,
57344 TO
50176 TO
0 T0 319 : Y=
57344 + (X AND 504) + 40 * (Y AND 248) + (Y AND 7)
uUSR (B) OR 2 $ (7 -
IF 6$ =
PEEK (56576) 14
65535 :
51175 :
(53272) OR 8
(53265) OR 32
100 - 100 * SIN (X * pi / 160)
AND 252 POKE 53280,
POKE I, 0 : NEXT
POKE I, 1 NEXT
PEEK
PEEK
(X AND 7)) : NEXT
"" GOTO 280
PEEK (56576) OR 3 :
PEEK (53272) AND 247
PRINT CHR$ (147)
PINBELEGUNG DER CPU 6510:
Pin 1 : PHO IN, Eingang des Systemtakts (um ein MHz)
Pin 2 : RDY, Ready-Leitung (dient im Zusammenhang mit
dem Anhalten des Prozessor, liegt RDY auf eins,
so stoppt der Prozessor im naechsten
Lesezyklus)
Pin 3 : IRQ/, Interrupt-Eingang des Prozessors, dient
zum Ausloesen eines Interrupts zum Beispiel
durch die CIAs oder den VIC-II-Chip
Pin 4 : NMI/, Eingang zum Ausloesen des nichtmaskier-
baren Interrupts
Pin 5 : AEC/, Address Enable Control, bringt Prozessor-
bus in hochohmigen Zustand und laesst dadurch
den Zugriff anderer Bausteine auf den Bus zu,
zum Beispiel durch den VIC-II-Chip)
Pin 6 : VEC, Versorgungsspannung von +5 Volt
Pin 7 20: AO bis Al3, Adressbus des Prozessors
Pin 21 : GND, Masseleitung
Pin 22 23: Al4 und Al5, Adressbus des Prozessors
Pin 24 29: P5 bis PO, Prozessorportleitungen
Pin 30 37: DB7 bis DBO, Datenbus des Prozessors
Pin 38 : R/W, Schreib/Leseleitung zum Zugriff auf Bus
Pin 39 : PH2 OUT, zweiter Systemtakt zur Steuerung
anderer Bausteine
Pin 40 : RES/, Reset-Leitung dient zur Startinitialisie-
rung des Systems, bei Uebergang von 0
(Ruhezustand) nach 1 wird RESET-Vorgang
begonnen.
FIH CONFIGURATICN
FHa IN — l 2 4a RES
RCı'r z 39 PH2 QUT
IRQ 3 38 Rh
NFII 4 Ir al=Tı,
AEG S 36 o&1
“WEL 5 >53] _ JDBE
Aa v 34 DE?
ri = 33 DB4
Az 3 32 DES
Bl 35 DBF
AST j12 23 Fa
As 13 2& Fi
Arie 27 S2
Mellıs 2 F3
erte 25 r4
art: I? 24 PS
All jıs 23 ALS
HI2I 19 22 Als
2] 2-2 aus Co GH!
(Er 5:4 PRAHS>SIcCcC
8968 143 227
48962
9964
123
57
2ev
65
53268
38235
Yv
&6&
zz
+55
Sprunsvektor fuer BASIC-Kaltstart CBASIC-RESET)
Sprungvektor fuer BASIC-Warmstart, wird kei NMI
ner
torindex und Stack ruecksetzen-
wendet ı
CLRCHN,. Descrip-
sperren.
Tastatur aktivieren,
"CONT”
"RERDY.". Eingakewuarteschleife)>
85
“‘ertortskelle der BASIC-Befehle
Jie folgenden Adressen kis einschliesslich
zeleat und durch das RTS der CHRGET aufgerufen.
a7 "CBMBASIC"
’"NEN” werden ak 43001 auf den Stack
Die Routinen kesainnen daher
zeeseils an der naechsthcaeheren Adresse.
33972
sa974
3397E
33978
3393a
32932
14984
SA93E
+4933
R99a
498992
499934
4399385
32998
1900
s1002
41004
s1a0&
31098
31910
1012
31014
41@16
41018
1920
31022
411924
s10285
41928
41934
41032
41034
310936
41933
31940
45
te)
293
247
164
190
128
ker
184
159
112
323
28
134
2a9
38
153
187
173
168
171
171
176
172
1693
163
1683
169
153
168
1683
169
163
1693
194
225
223
223
1723
134
1va
170
183
16&&
16E
170
223
225
225
171
i6S&
43056
42317
44317
43255
43940
43966
45194
44037
43428
43167
43120
4333
43036
431393
43217
43322
43954
43333
47148
Sr r783
57695
SYr’eag
45002
47137
43647
436572
43094
42631
42539
43653
Sr64l
37799
57798
43398
42561
128
129
138
131
132
133
134
135
136
137
138
137
140
141
142
143
144
145
146
147
148
149
1508
151
152
153
154
155
156
157
158
1597
180
161
162
END
FOR
NE=#T
DATA
INPUT#
INPUT
Dim
READ
LET
GOTO
RUN
IF
RE=TORE
GOSUB
RETURN
REM
STOP
ON
HALT
LOAD
SAVE
VERIF'Tr
DEF
POKE
PRINT#
PRINT
LONT
LIST
CLR
CMP
SYS
OPEN
CLOSE
GET
NEW
133
Vektortakbelle der BASIC-Funktionen
Die Adressen der Funktiorner werden ak 459814 nach (S3786) gekracht und denn durch
JSR 84 “in 84 steht der Code fuer IMP> aufserutfen.
41042 57 188 43185 184 SGN
41844 2084 188 43332 151 INT
41046 88 158 43216 182 ABS
41043 16 3 r94 183 USR
4105q 125 179 45949 184 FRE
41052 158 179 435982 185 POS
41954 113 191 499049 1SE& SOR
41055 151 224 57493 187 RNOD
410593 234 1893 47394 188 LOG
41064 237 191 49133 1893 E<P
41062 100 226 37956 19a COS
41964 107 226 537963 191 SIN
41066 180 226 ssa36 192 TAN
41068 14 227 58126 133 ATN
4a1a7a 13 194 47117 194 PEEK
41972 124 183 46972 193 LEN
41074 191 184 46181 196 STR$
41076 173 183 47021 197 YAL
41978 139 183 46987 193. RSC
410508 236 182 46828 1939 CHRS$
41082 a 193 46949 zen LEFT$
410384 44 183 46392 281 RIGHT$
4190986 55 183 46903 2202 MIDS
Tabelle der Pricritsetsflaas und Adressen fuer die Formelsuswer tung
Die folgende Takelle enthaelt fuer die angegebenen Funktionen Jeweils ein
Prioritsetsfl39 und die Stsartadresse. Die Adresse wird ab 44576 zuf den Stack
skgelegt und durch RTS aufgerufen. Die Routinen keyinnen dsher also jeweils ar.
der naechsthoeheren Adresse.
41088 121 105 194 121 ar7209 ıiva +
410891 121 82 194 121 47186 171 -
410994 123 42 196 123 476558 ir2 *
41097 123 17 197 123 47989 173
41184 127 122 191 127 49918 174 Tr
41193 30 232 175 sa 45932 175 RAND
aı1las va 229 175 ra 45929 176 OR
41199 125 179 191 125 49075 Yorzeichenwechsel
41112 99 211 174 9a 44735 168 NOT
41115 1900 21 176 109 45077 177 > 173 = 179 <
134
C- EN 54 BASIC zZ - - - - - - +1113
Takelle der BRSIC-Befehlsworte fuer Tokenumwandlung und LIST
411138 69 78 196 END
41121 78 79 218 FOR
41124 78 69 88 212 NEXT
41128 6863 65 84 193 DATA
41132 73 78 sa 985 94 163 INPUT#
41138 73 7 sa S5 212 ‚INPUT
41143 65 73 205 Dın
a11l46 82 659 65 196 RERD
411508 T& 69 212 LET
41153 71 79 34 207 GOTO
41157 982 85 206 RUN
4ai1lsda 73 198 IF
41162 82 89 83 94 73 82 197 RESTORE
41169 7’ıi 73 833 935 194 GOSUB
4i174 S2 69 984 85 82 286 RETURN
411lsa 982 69 205 | REM
41183 83 94 7? 288 STOP
41187 79 206 ON
41189 87 65 73 212 HRAIT
41193 vVä 79 653 196 LOAD
41127 83 65 936 197 SRYE
a1201 986 69 S2 73 7a 217 VERIFY
41207 68 659 193 DEF
41218 Sa 79 75197 FOKE
aı214 Sa S2 73 73 84 163 PRINT#
41220 Sa S2 73 78 212 PRINT
41225 867 79 78 212 CONT
41229 v6 73 83 212 LIST
41233 67 76 21a CLR
41236 67 77 196 CMO
41239 533 8997 211 SYS
41242 79 8a 69 206 OPEN
41246 67 76 79 83 197 CLOSE
41251 v1 69 212 GET
41254 738 69 215 NEN
135
CM S:4+4 BRSIC Vz - - - - - - +15”
Tabelle der BASIC-Befehlsworte fuer Taekenumuandlung und LIST (Fortsetzung)
41257 84 865 66 168 TAB:
41261 984 207 TO
41263 7O 206 FH
41265 83 8a 67 168 SPC«
41269 94 72 69 26 THEN
41273 78 79 212 NOT
41276 83 94 69 208 STEP
41280 171 +
41281 173
41282 17a %
41283 175 >
41284 222 t
41285 65 73 19 AND
41288 79 zıa OR
4129@ 190 >
41291 189 .
41292 188 <
412933 83 71 206 SGN
412968 73 78 212 INT
41299 85.66 211 ABS
413Qa2 85 83 21a USR
41ı2a5 7a 82 197 FRE
aızas sa 79 211 POS
41311 83 Sı 210 SOR
41314 82 78 19€ RHO
41317 76 79 199 LOG
413208 69 88 208 ExF
41323 67 79 211 cos
41326 83 72 206 SIN
41329 84 65 206 TAN
41332 65 934 206 ATN
41335 sa 69 69 203 PEEK
41339 76 69 206 LEN
41342 83 84 82 184 STR$
41346 86 65 204 AL
41349 65 83 195 ASC
41352 67 72 32 184 CHR&
41356 76 53 7a 9a 1654 LEFT$
a1361 82 73 Tı 72 984 164 RIGHT$
41367 77 73 68 164 MIO
41371 7ı 2a7 Go
41373 a Trenncode
136
cBn S4+4 ERSIcC WW
3A5IC-Fehlermeldunaen
1374
213838
1397
1418
1424
+1435
21442
1456
11467
41471
21434
11483
41496
+1509
1522
21525
1531
+1533
1591
41562
1562
431578
31586
1599
31607
41616
21629
411542
1634
21658
sie’
21685
21696
117008
1709
1721
1728
1742
1750
41759
1764
?
NO NAT NT
21a
32
89
216
32
765
a4
9
32
53
593
66
58
9
’&
"23
32
65
55
216
57
==
9
85
137
32
r8
21a
194
gr’ 212
85 197
- +12374
TOO MANY FILES
FILE OPEN
FILE NOT OPEN
FILE NOT FOUND
DEVICE NOT
PRESENT
NCT INPUT FILE
NOT OUTPUT
FILE
MISSING FILE
NAME
ILLEGAL
DEVICE NUMBER
NEXT WITHOUT
FOR
SYNTAX
RETURN
WITHOUT GOSUB
OUT GF DATA
ILLEGAL
QUANTIT'Y
OVERFLOU
GUT OF MEMOR'Y
UNDEF”’D
STATEMENT.
BAD SUBSCRIPT
REDIM’D ARRAY
DIVISION BY
ZERO
ILLEGAL DIRECT
TrPE MISMATCH
STRING TOO
LONG
FILE DATA
FORMULA TOO
COMPLEX»
CAN’”T CONTINUE
UNDEF ’D
FUNCTION
VERIF'Y
LORD
cCcEMN &4+ BASIC vVz a e z
Startadressen der BASIC-Fehlermeldurgser
41768
417708
41772
a1774
41776
4177
41780
41732
41784
41798
41788
41798
41792
41794
41796
41798
41500
41802
418304
41S06&
41308
41810
41912
41814
41816
41818
41820
41822
41924
419326
158
172
181
161
161
161
161
161
161
161
161
162
162
162
162
162
162
162
162
162
162
162
162
182
162
162
162
162
1683
163
163
163
163
41374
41383
41397
41418
41424
41442
41456
41471
414838
41509
41325
41531
41951
41562
415373
41586
415939
41616
41829
41642
41653
41672
4165985
41700
41709
41728
41742
41758
41764
41859
weitere Meldungen
419828
41333
41941
41946
41357
41865
9
32
„Ss 13
89 92
‚SS >32
82 69
66 82
DO NAIMNNLWmM-
- TOO MANY FILES
- FILE OPEN
- FILE HOT GPEN
- FILE NOT FÜLIND
- DEYICE NOT FRESENT
- NOT INPUT FILE
- NOT QUTPUT FILE
- MISSING FILE NANE
- ILLEGAL DEYICE HUMBER
- NEXT WITHOUT FOR
- SYNTAX
-— RETURN WITHÜLT GOSUB
- QUT GF DATA
- ILLEGAL QUANTITY
- QVERFLOU
- QLUT OF MEMORY
-— UNDEF"D STATEMENT
- BAD SUBSCRIPT
-— REDINM’D ARRAY
- DIYISION BY ZERO
- ILLEGAL DIRECT
- TYPE MISMATCH
- STRING TOQ LONG
- FILE DATA
- FORNMULA TOO COMFLEX
- CAN”T CONTINUE
- UNDEF’D FUNCTION
- VERIFY
-— LORD
- BRERAK
68 89 46 13 14 5
65 75 8
138
CE &4I+ BRSIC zZ - - - - - - 4195
Stack-Suchroutine fuer ”’FOR’. ’NEXKT’” und "RETURN”
41866 TS% Bei den naechsten „vier Bytegs im Stack handelt
41867 INA es sich um zwei Ruecksprunssdressen \“Ruescksprung
4193658 INH in Interpreterschleife und Rueckzsprung zur
419659 IHx aufrufenden Routine?
4a187a INA
413871 LDRA 237,8 Ist nsechstes Stackbyvte identisch mit
41374 CHMP #129 FOR’ -Code?
41876 ENE 41911 Neinsı Schleife nicht gefunden, RTS
41378 LDA v4 Ist FOR-NEXST-Yarisklenpointer hish = 97 Cugal. 44320)
a1290 BHE 418392 keine Yariablenangake kei NEXT> Neins weiter kei 41892
41882 LOA 258,8 Yarisklenepointer der innersten Schleife
41835 STA 73 aus dem Stack nach (73774? kringen
41337 LDR 259 ,%
41394 STA rq
41832 CP 259.5 LP’) mit Yarisklenpcinter im Stack vergleichen
413935 EHE 41904 Ungleichs nasechste Schleife suchen
41397 LORA 3
41399 CHP 258 .X%
41392 BER 41311 Gleich: Schleife sefunden, RTS
419394 TXA 2
41905 CLE Suchzeiger um 18
4190& ARDC #13 “Anzahl Bytes je FOR-NEXT-Schleite)> erhoehen
41903 TAX
41709 BNE 41871 Unbkedingter Sprung zum Schei fenkegsinn
41911 RTS
Rufkzuı der Datenssaetze „on FÖOÖR-NHEXT und GOSUR im Stack
ee rn he A IE GE GE GERD [Rob (de Ge Sud auiie GR Auen Amin GERD GIEE AED ale AHEED (END> antun Gate GENE JEHEe GEND GEEER GEHE AANED mu Anz Anget, Gm AUDED Himm AbrAEr Arsen Ai aypmmm Gmmms dumm HAND OAfEm GEED AEDEm GENEm Anm Göm AEES Ammm Cup aan
J FOR-NEXT l GOSUB )
ı A Schleifenstartadresse low I a CHRGET-Pcointer high l
ı1ı hiahi 1 low 1
I 2 Zeilernummer hishi 2 Zeilennummer hioh I
ı 3 lau 13 lom }
ig TQO-Wert LSB 4 GOSUB-Code 141 l
= l--- --- - - --- -- - Sn anmanannnnn
=: l
ı 7 NSB, Yorzeichen
153 Exponent L
I 9 STEP-Wert Vorzeichen )
ma LSB l
si |
1 l
113 MSB )
114 Exponent |
115 Yariabklenpointer higahl
118 low 1
pn Gun Gun cum sun GR An dem sim ai ariiD Gin ME dan cmme> GERD Ammme sumun AD Guie SEEEn CEEE GEN Au SAEp (Een GEEm Gun Gum Aue GE.
u rm muup zn Gen Sun en Ges Gen ORze GEmD GERD Gum Are GumD auiD SED FEED Gent main GEEED SEERD aufle (ERS ailEE Guiin Au Cum Cm GER
139
CE 5:4 BRSIcC ZZ - - - - = -
Block-YVerschiebe-Routine
Einbau von Preoursmmzeilen und Yerschieken “an Arravs
Eingabe:
41312
41915
41917
41919
41920
41922
41924
41926
41927
41929
41931
41932
41933
41934
41336
41938
41933
41941
41943
41945
41947
41348
41950
41952
41954
41956
413583
419608
41962
41964
41965
41967
419693
41971
41973
41975
41976
41978
Test,
41979
41988
41982
41984
41986
419837
4193893
41991
SR
STR
ST'r
SEC
LDR
SBC
STR
TAY
LDA
SBC
TA%
IN*
TrA
BEQ
LOA
SEC
SBC
sSTA
BCS
DEC
SEC
LODR
SBC
sta
BCS
DEC
BCC
LDA
sSTA
DE'Y
BNE
LDRA
STA
.DEC
DEC
DEX
BNE
RTS
ob senug Platz im Stack
ASL
ADC
BCS
sTtA
TS%
CPX
BCC
RTS
Quellbereich:
eielbereich:
34
98
41948
1
83
34
S8
41964
s9
41964
985 ,Y
3537 ,Y
41968
90) ,„Y
385 .Y
si
39
41964
#62
42037
34
34
42037
19596)
«9a.91>
89789) zauie
Sstartadresse:
Endadresse+l:
Endadresse+1: Accu VYR >
> Pruefunga, ck genug Freier Platz im Speicher
Accu TR) als neue Startadresse
fuer freien Speicherplatz speichern
Startadresse von der Endadresse des
Quellbereich subktrahieren
ersibt Laenge des Quellklack Tom
Ebenso Bvrtes hiah suktrahieren,
ergikt Zaehler der vallen 256-Evrte-Akschnitte
Ist ein Restaskschnitt vorhanden”
Nein: nur sganze Pages verschieben
Endadresse+1l des Quellkereichs
minus Lasenge des Restskschnitts
ergibt Raresse des Restskschnitts
Endadresse+1l des Zielbereichs
minus Laenge des Restakschnitts
ergikt Adresse des neuen Restskschnitts
Inkedingyter Sprung
Transtfer-Schleife fuer Restakschnritt
Transfer-Schleife fuer ganze Pages
Zaehler fuer gyarze Pages vermindern
ARecu ı= 2 % Accu
+ 682
Ist Accu keim Rufruf > 96
oder ist der Stackpointer
<2 %* (Accu) + 82?
Jas "OUT OF MEMORY ERROR"
140
Anzahl bencetigter Unterproarammekeren im Accu?
c-Eeri
est,
1992
411994
21996
41998
2900
szz002
12063
42005
120086
22007
22009
za1a
22012
2015
s2a17
ı2A18
sza2a
22021
12023
32024
32025
12026
120283
zza2a
g
in
42044
20495
22048
2054
12053
42057
42058
412060
420682
320653
4205683
32070
32072
20723
42073
320783
42079
20980
32032
420353
320537
208393
42092
32094
42095
42097
+ FHMZ=ZIc WzZ - - - - - -
ak
CP'Yr
BCC
BHNE
CHP
BCC
PHR
LD*
TrYA
PHR
LOA
DER
BPL
JSR
LD#
PLA
STA
IN“
BMI
PLA
TA’r
PLA
CP'r
BCE
BNE
CMP
BCS
RTS
LD«
IMP
TRRA
ASL
TAs
LDFA
STA
LODA
STA
JSR
LDA
STA
JSR
’SR
LDY
LODA
PHR
AND
JSR
INY
PLA
BPL
JSR
LDA
LDY
ISR
LDY
IN’
BEQ
JSR
s2
420836
4zaa2
Si
+42a36&
er „,
ST ch
#16
768)
41766.
34
41767,%
35
594894
#a
19
43735
43345
#0
245 ,Y
#127
43347
42078
42618
#105
#163
428306
55
42100
43578
+19
gerua Flatz im Rrbkeitsspeicher
Accu YR> ist Endadresse, bis zu
der Speicherplatz kenoetigt wird
Ist diese Adresse kleiner als mamentaner
str ing-Anfangszeiger? Ja: RTS
Recu, TR und 187 ,.2...2,96>) auf
Stack zwischenspeicherHn
> GARBAGE COLLECT. Str ingmuellkeseitiaung
Accu, YR und «S7,....96> wiederherstellen
Nochmals "Accu VYR> mit (51752) vergleichen
Jetzt senua Platz? Ja: RTS
sonst "OUT OF MEMORY ERROR"
gabe van Fehlermeldungen und RERDYT-Status
Code fuer "OUT OF MEMORY"
Normalwert des Vektars (7697759), 58251
Accu ı= 2 % Accu
Startadresse der Fehlermeldung
aus Tabelle in Painter (34,.35> bringen
> CLRCHN. alle Kansele schliessen
aktiver Eingake-Kanal :ı= Tastatur
> Zei lemvorschukb drucken
> "PN drucken
Fehlermeldung zeicherweise in Rccu laden
Bit 7” loeschen (ist beim letzen Zeichen = 1)
> Zeichen im Rcecu ausgeben
Mer im letzen Zeichen Bit 7 geretzt?
Nein: weiterdrucken ...
> CONT sperren, Stack und Descriptorindex rueckgetzen
Accw’YR? ı= 41833, Stertadresse von " ERROR"
> " ERROR" drucken
Zeilennummer hiah <Cist im Direktmadus = 255)
Direktomodus? Ja: weiter bei 42108
> " IN " und Zeilennummer drucken
141
C5rn 854 BRSIC zZ - - - - - -
Nusaabe varı
42108
42102
42184
42187
421099
42112
42115
42118
42120
42122
421253
42126
42128
42138
42132
42134
42137
LDA
LD'Yr
JSR
LDA
JSR
JMP
JSR
sta
STYr
JSR
TA%
BEO
LD«
ST*
BCC
JSR
JMP
"RERDY.". Eingakewarteschleife
#119
#163
4398086
#128
65424
778)
42336
122
123
115
42112
4255
38
421489
42361
42977
AccwVYR) :ı= 419346, Startasdresse non "RERDY. "
> "READY." drucken
Direktmodus einschalten
= SETMSG, Ausgsabemodus setzen
Hormaluwert des Yektaoars (/7a/7/1>: 42115
> Eingsake-Warteschleife, zurueck nach "RETURN?
CHRGET-Pointer auf 511 (ein Byte vor Einasbepuffer
setzen
> CHRGET holt nwechstes Zeichen
setzt Zero-Fl393, falls Accu =
keine Eingabe, zurueck zur WMarteschleife
Fla9 fuer Direktmadus setzen
Ist erstez Zeichen eine Ziffer? Js: Proarammzeile
> Text im Eingabepuffer in BASIC-Tokens umwandeln
> Interpreterschleife,. eingegebene Zeile ausfuehren
Loeschen und Einfuesen „on Praurammzeilen
42148
42143
42146
42143
42151
42153
42155
42157
42153
42161
42163
42165
42167
42169
42178
42172
42173
42175
42177 °
42179
42181
42183
421835
42187
42188
421393
42191
42193
42194
421976
42197
42139
42280
42202
42204
42206
42207
422093
42211
42212
JSR
ISR
ST'r
JS5R
BCC
LD'Y
LDA
5TA
LDA
43371
42361
11
42515
42221
#1
95) ,Y
> Zeilennummer nach «“20721> hringen
> Text im Eingabepuffer in BASIC-Tokene umwandeln
Laenge der Zeile
> Startadresse der Zeile nach 9%°96)
Zeile bereits vorhanden? Neins kein Loeschen
Startadresse hiash der naechsten Zeile
Yariaklen-Anfanaspointer 10w
Startadresse high der zu loeschenden Zeile
Startza4resse lou der zu loeschenden Zeile
Startadresse low der naechsten Zeile
Yarisklen-Anfansspointer 1cow
ergibt neuen Yariabkblen-Anfangyspointer low
ekensca high
startsdresse hiah der zu loeschenden Zeile
ergsibt Anzahl der zu verschiekenden Pas93e=s
Startadresse low der zu loeschenden Zeile
Variaklen-Anfanaspointer low
Laenge des Restakschnitts
> 2557 Nein: weiter kei 42199
Zaehler fuer 256-Brte-Bloecke um eins erhoehen
Transportzeiger initialisieren
Transfer-Schleife
142
+42 10908
cBr
SS BASIC
_>eschen und Einfuegen von Programmzeilen (Fortsetzung?
2214
2216
2218
22219
221
22224
2227
12238
42232
12233
12235
12237
12239
2241
12243
12245
12247
42248
2250
42253
122535
4122537
12260
12263
22689
w267
12269
er |
42273
2274
12277
412279
12288
12282
12285
12298
INC
INC
DEx
BNE
JSR
ISR
LOR
BEQ
ELC
LDA
sTaA
ADC.
STR
LDY
sSTr
BCC
INY
STY
JSR
LDA
LDY
STR
SsTTr
LDA
LD'Y'
STR
ST’Yr
LOY
DE'Y
LODA
sTtA
DEY
BPL
JSR
JSR
JMP
35
37
42207
42385
42291
512
42112
45
938
11
S8
46
91
422483
89
41912
28
21
s18
s11
49
Sa
45
.4&
11
308,"
957 ,Y
42274
42335
42291
42112
_ınkposinter fuer
sc291
12293
2295
12297
122993
12300
12302
2304
2306
127388
12399
+2311
LOR
LD'Y
sta
ST'Tr
CLC
LDY
LDA
BEQ
LOW
INT
LDR
BNE
43
44
34
35
#1
54 ,Y
42335
#4
34) ,T
42308
> CHRGET-Pointer ruecksetzen. CLR
> Linkepointer fuer Zeilen neu berechnen
Mar erstes Zeichen im Eingsbkepuffer = B?
Jar Zeile nur loeschen, zurueck zur Warteschleife
Y“ariablenanfsngszeiger lou
Endadresse+1 (Quellkereich> low
Laenge der Zeile
Endadresse+1 «Zielkereich> 1lou
Yariaklenanfanaszeiger high
Endadresse+1 CQuellkereich> hiah
Vekertra9a addieren
Endadresse+1 “Zielbereich> hiah
> Block-YVerschieke-Rautine
Zeilenrummer in C280721>
nor Eingakepuffer setzen
neuer Yzriaklen-Endezeiger al. 41915)
Pcinter zuf Programmende+i1
Zeilenliaenge
Verschiebeschleife transferiert die neue Zeile aus
Eingabepuffer in den Frbeitsspeicher
CHRGET-Fointer ruecksetzen, CLR
Linkpointer fuer Zeilen neu berechnen
Zurueck zur Eingasbe-Warteschleife
I 4
q
b}
ceilen neu kerechnen
Prosar sum -Anfangspointer
als Suchzeiger nach (34,357) speichern
Linkadresse high
= 8? Ja: Programmende erreicht, RTS
V”R auf erstes Zeichen des Programmtextes setzen
Naechstes Zeichen = 8?
Nein: Zeile moch nicht zu Ende, weitersuchen
143
u 2 Br ©
_ Erf © + BRSIC zZ - - - - - - + 3122
Linkpcinter fuer Zeilen neu kerechnen (Fortsetzung?
42313 INY
42314 TYA Zeilenlaenge
42315 ADC 34 Pceinter low auf aktuelle Zeile
42317 TRA%
42318 LDY #0
42320 STR 234) ,.7 als Linkpcinter lcaw speichern
42322 LDA 39 Pcinter hiah auf aktuelle Zeile
42324 ADC #0 liekertray addieren
42326 INY
42327 STA 345,7 als Linkpceinter hiah speichern
42329 ST*K 24 Startadresse der naechsten Zeile
42331 STA 33 nach 1.34.35 speichern
42333 BCC O2 4230a0R Unkedinater Sprung zum Zei lenantang
42335 RTS
Eingake-Warteschleife, zurueck nach "RETURN”
423368 LDS 40 zeiger in Eingakepuftfer
423383 JSR 57618 > Zeichen von Tastatur in Accu
422341 CMP #13 Carrisase Return?
42343 BEQ 42358 Jas Akschluss
42345 STAA 512.8 Zeichen im Puffer zpeichern
42348 INS Zeiger erhaecher
42349 CPX #39 Puffer wall?
42351 BCC 42338 NHeins weitermachen ...
42353 LDS #23 Code fuer "STRING TOO LONG"
42355 JMP 42039 > Fehlermeldung, REAUL!'T.
42338 IMP 43722 > Abschluss der Eingske
Text im Eingakepuffer in BASIC-Tokens umwandeln
42361 JMP ıv’v2) Normalwert des Yektors (7727/7737: 42264
42364 LDX 122 (122.123) zeigt auf erstes Zeichen im Einyskepuffer
42366 LDY #4 Zeiger fuer cadierte Zeile
42368 STY 15 "DATA’-Fl2aqg loeschen
42370 LDRA 512,8 Zeichen aus Eingakepuffer holen
42373 BPL 42332 ASCII Z 128 (ungeshiftet>? Jar weiter kei 42382
42375 CMP 4255 Code fuer PI?
42377 BEQ 42441 Jas abspeichern
42379 INS Zeichen ueberlesen
42380 BNE 42370 Unkedingter Sprung zum Schleifenanfang
42382 CMP #32 Leercode”
423934 BEQ 42441 Ja; abspeichern
423836 STA 8 Code nach (8) speichern “wenn Code = 34 vol. 424745
42388 CMP #34 Anfuehrungszeichen?
4239308 BEQ 424783 Ja: weiter hei 42478 _
42392 BIT 15 Bit & gesetzt <ODATA>?
42394 BWS 42441 Ja: ASCII ungesendert akspeichern ,
42396 CMP #463 Code fuer Fragezeichen (Abkuerzung fuer "PRINT”>?
42398 BNE 424084 Neins weiter kei 42404
42480 LDA #153 Token fuer "PRINT” skspeichern
42402 BNE 42441 Unkedingater Sprung
144
c-Er
+ FSH5SIc Vz - - - - - -
42404
Text im Eingakepuffer in BASIC-Tokens umwandeln “Fortsetzung?
42494
42406
42498
42418
42412
42414
42416
42418
42419
42421
42422
42423
42424
42427
42428
42431
42433
42435
42437
42439
42441
42442
42443
424486
42449
42451
42452
42454
42456
42458
42460
42462
42463
42465
42467
42469
42472
42474
42476
42478
42479
42482
42483
42435
42497
42439
42490
42493
42495
42498
4250
425093
42505
4250958
42514
42512
42514
CMP
BCC
CMP
BCC
STTr
LDY
STTr
DE'Y
sT#s
DE=
INT
IN*
LOA
sEC
SBC
BEO
CMP
BNE
ORA
LDY
IN»
IN'Y
STA
LOA
BEO
SEC
SEC
BEQ
CMP
BNE
STA
SEC
SBC
BNE
STA
LODA
BEQ
cHP
BEQ
IN'Y
sta
IN
BNE
LOS
INC
IN'Y
LDA
BPL
LOR
BNE
LDA
BPL
STA
DEC
LODA
STA
RTS
#48
42412
#60
42441
113
#0
11
122
41113,Y
42422
#128
42435
11
113
Ssar,'r
Sso7,'Y
42595
#33
42460
#723
42462
15
#35
42370
S
512,#
42441
3
42441
122
11
41117,YV
42459
41113,V
42424
Ss12,r
42439
Ssa9 ,'Yr
123
#255
122
Code < 437?
Ja: weiter kei 42412
Code > 607
Nein: weiter bei 42441
Painter auf coadierte Zeile merken
Mortzaehler fuer Tokentaskelle initialisieren
Zeiger auf Eingskepuffer zwischenspeichern
falls Moart nicht gefunden?
Yon Zeichencade im Puffer
Zeichencode zus der Befehlstskelle zsuktrahieren
Ergeknis = A? JIzası naechstes Zeichen
Erseknis = 1283 (letztes Zeichen im Wort oder Abkuerzung)”?
Nein: Befehl nicht gefunden, weiter kei 42435
Bit 7 im Vlortzaehler setzen, ergibt Code fuer Token
Pointer auf codierte Zeile wieder holen
Code sakspeicherHn
Zero-Flag setzen
Mar Code = B (Endezeichen?”? Jar weiter kei 42595
Code fuer Trennungszeichen "3,"?
Ja: weiter kei 4d24&8A
"DATA’-Code? (131 — 58 = 73)
Nein: weiter bei 42462
Fla4 fuer ’DATA” setzen
Code fuer "REM’? “143 — 58 = ST”
Neins zurueck zum Schleifenanfang
8) ı= 8, falls Code fuer "REM”
naechstes Zeichen aus Puffer
Endezeichen?” Jar weiter kei 42441
weiterhin Abspeicherung als RSCII? <ugl.
Neins weiter kei 42441
423836)
Code abspeichern
Sprung zum Schleifenanfang “RSCII Akspeicherung)
Zeiger auf Eingabepuffer wiederherstellen
Mortzaehler erhoehen
Zeiger auf Anfang cles naechsten Befehls setzen
Tabelle zu Ende?
Nein: weiter kei 42424
Naechstes Zeichen aus Eingabepuffer
< 128? Jaır weiter kei 42439
Code im Puffer speichern
CHRGET-Fointer auf 511 ruecksetzen
145
CE &©ı+ PBnSIc WW - - - - - - -+27>1
Berechnung der
Eingabe: Zeile
Rusgakbeı Zeile
Sstartadresse eirer Proarsmmzeile
nnummer in 120.21D
vorhanden:
Carry = 1, Startadresse der Zeile in (9596)
Zeile nicht vorhanden :
Carry = 0, Startadresse der naechsten Zeile in 95%”96)
42515 LDA +3 Pointer auf Progr-ammstartadresse
42517 LD* nz!
42513 LDY #1 Index fuer Linkpainter high
42521 STA 93
42523 ST 96
42525 LDA 95) ,Y Linkpainter hiah
42527 BEQ 42560 = @a (Programmende)>? Ia: Zeile nicht gefunden
42529 INY
42539 INY VR := 3
42531 LOA 2i gesuchte Zeilennummer hiah mit
42533 CMPUOcI,Y Zeilennummer der aktuellen Programmzeile „eraleichen
42535 BCC 42561 kleiner? Ja: Zeile nicht gefunden
42537 BEO 42542 gleich? JIas weiter hei 42542
42539 DEY YR ı= 2
42540 BNE 42551 Unkedinsater Sprund
42542 LDRA 2a gesuchte Zeilernummer low mit
425344 DEY YR :ı= 2
42545 CMP 95) ,7 Zeilernnummer der aktuellen Froarammzeile »ergleichen
42547 BCC 42561 kleiner? Ja: Zeile nicht gefunden
42549 BEQ 42561 gleich? Jar Ruecksprunga mit Carrv = 1
42551 DEY YR := 1 i
423552 LDA 957,7 Linkpointer high in AR
42554 TAX
42555 DET TR :=
42556 LDRA 935) ,Y Linkpointer low in Accu
42538 BCS 42519 Unkedingter Sprung zum Schleifenanfang
42560 CLC Flag fuer "Zeile nicht vorhanden” setzen
425651 RTS
BASIC-Routine
NEW Senthaelt CLR>
42562 BNE 42561 Folgyat Trennungszeichen? Nein: "SYNTAS ERROR”
425694 LDA #8
42566 TAY
42567 STA 432,7 Null in die ersten keiden Stellen des Proasgr ammspeichers
42569 INY 20499, 2050) schreiben
42570 STR 437 ,YV
42572 LORA +3 Progar amm-Anfanapointer low
42574 CLC
42575 ADC #2 + 2
42577 STA 45 ersikt Yariaklen-Anfanspointer 10ow,
42579 LDR 4 ebenso Progr amm-Anfasngspointer hish
42591 ROC a leßertrag addieren
42533 STA 46 ergibt Yariaklen-Antanaseointer hiah
42585 ISR 42638 > CHRGET-Pointer ruecksetzen
425883 LDA #09 Setzen der Zerc-Fl=3 fuer Uebergang zu CLR
146
c-Br ©S+ BRASIC WW - - - - - - 14er
BASIC-Routine CLR
42594 BNE 42637 Folst Trennunaszeichen? Neins "SYNTAX ERROR"
42592 JSR 65511 > CLALL, alle Kansele loeschen
425975 LOR ba te) oberste RANM-Grenze
42597 LD’Yr 5&
42599 STA 51 String Anfangaspointer
42691 ST'Y 52
42603 LDA 45 Yariaklen-Anfangspointer
42605 LDY 46
42607 STA 47 Arr av-Anfangyspointer
42609 STTr 48
428611 STA 49 VYariskblen-Endepeinter
42613 ST'Yr 58
42615 JSR 43937 > RESTORE
426518 LD%S #253 Sstringdescriprtorzeiger ruecksetzen
42628 STX 22
426522 PLA Ruecksprungadresse merken
42623 TA’TYr
42624 PLA
42625 LDS 4250 Stack ruecksetzen
42627 T&S
42528 FHR Ruecksprunaadresse wiederherstellen
42623 TYR
426536 PHA
426231 LDA #0
42633 STR 82 CONT sperren
42635 STA 16 Fla93 fuer YVariaklenverwaltung
42637 RTS
CHRGET-Fointer ruecksetzen
42633 CLC
426393 LDR +3 Progr amm-Anfansspceinter low
42641 ADC 4255 - 1
42643 STA 122 .erasibt CHRGET-Pointer law
426.45 LDA 34 Progr amm-Anfanaspointer hiah
42647 ARDC 4255 + Vebertr393
42649 STA 123 ersibt CHRGET-Pcointer hiah
42651 RTS
147
CBM sS4+ BAasıc v2 _ _ _ £ _ _ 4z2&52>
ERSIC-Routine LIST
42652 BCE 42660 erstes Zeichen Ziffer oder
42654 BER 4256608 Trennungszeichen? Ja: weiter bei 4zssa
426565 CMP #171 folst "-" nach ’LIST”?
42655 BNE 42637 Nein: STNTAX ERRÜÖR
42660 ISR 43371 > erste Zeilennummer nach (Za.21) = A. falls "-" Falat)
42663 JSR 42515 > Startadresse der Zeile nach "95%’96)
425868 JSR 121 > CHRGOT holt letztes Zeichen
42659 BEQ 426833 Trennunaszeichen? Ia: weiter kei 42533
42571 CMP #171 "_")
42673 BNE 42561 Nein: STNTAS ERROR
42675 JSR 115 > CHRGET halt naechstes Zeichen
42678 ISR 43371 > zweite Zeilennmummer nach (20.21>
42651 BNE 42561 Folgt Trennunaszeichen? Nein: "SYHTA= ERROR"
42683 PLA Ruecksprungadresse in Interpreterschleife entfernen
428684 PLA
426385 LDA 2a zweite Zeilennummer = 07 “oder Zeilennummer, falls nur
42687 DFEA ei eine Nummer angegeken: daher funktioniert "LIST &” nicht)
42689 BNE 426897 Nein: weiter bei 426937
425371 LDA #255
426593 STA 20 zweite Zeilennummer := 65535 <Maximalwert)
42695 STA 21 i
42697 LDY #1 Indirect-Pointer setzen
42699 STYr 15 Quote-Madus abschalten
427a1 LDA 95) ,Y Linkadresse hiah = & (Proarammende)>”
42703 BEQ 42772 Ja: fertig, weiter kei 42772 (READY. >
42705 JSR 43952 > RUNSTOP-Taste abfragen. ewtl. Abbruch
42703 JISR 43735 > Zeilemwoarschuk drucken
42711 INY
42712 LDA 9) ,Yr Zeilenummer nach (X&R,’Accu)
42714 TA
42715 INY
42716 LDA 957 ,.Y
42718 CMP ei Ende erreicht?
42z7’za BNE 42726
42722 CPX 2a
42724 BEQ 42728
42726 BCS 42772 Ja: fertig, weiter bei 42772
42725 STYr 73 YR zwischenspeichern
4273a JISR 4898589 > Zeilennummer in String umwandeln und drucken
148
-er1
+ BSA5lIc zZ - - - - - -
35S1C-Routine LIST “Fortsetzung?
42733
42735
737
12739
742
42744
2746
2748
12759
12752
12753
2755
Dt
12739
2760
2762
763
LOR
LD'Y
AND
JSR
CMP
BNE
LOA
EOR
STA
IN'Y
BEQ
LDA
BNE
TAr
LDA
TAs
INT
LOA
SsTr
sSTA
BNE
#32
72
#127
43347
42307
41118,"
42799
427986
41118,
42735
43347
42897
Code fuer Space
YR wiederherstellen
Bit 7 lseschen
> Zeichen drucker
Anfuehrungszeichen?
Nein: weiter kei 42752
Qucte-Fla3 irwertieren
kein Ende der Zeile nach 255 Zeichen? Ja: Rufhoeren!
Naechstes Zeichen
Zeilenende”? Nein: weiter bei 42775
YR
Startadresse der naechsten Zeile
nach 99796) bringen
Unkedingter Sprung
> RAusgabke "RERDY.", Einasbewarteschleife
Normalwert des Yektors (7747775) ı 42778
Code < 1287 Ja: zurueck nach 42739
Code fuer PI”
Ja: zurueck nach 42739
Quote-Madus eingeschaltet?
Jas zurueck nach 42739
Martzaehler fuer Befehlsworttakbelle
YR zwischenspeichern
Pceinter auf Befehlstakelle
vermindern. Klartext fuer Token gefunden?
Jas Rusdrucken, weiter 42807
zeichen in Befehlswarttabelle
uebkerlesen. kis
letztes Zeichen des Befehlswartes erreicht
Zeichen aus Befehlswarttakelle
letztes Zeichen im Wort? Ja: zurueck nach 42735
> Zeichen drucken
Im Normalfall unkedingter Sprung (ausser Code 204)
149
+27 >33
CB S©S+ BHRSIC WVZ - - = - - -
BRSIC-Routine FOR
42318
42320 :
42322 .
42325 .
42328
42338
42331
428373
42334
423353
42336
42337
42333 .
42342
42345
42346
42347
42349
42550
42352
429354
42355
42357
428383
42368
42361
42363
423665
42367
42372
42974
42376
428373
42330
429832
423834
42826
42338
42571
42393
42895
42.338
42901
42983
42385
42338
42311
42914
429317
423173
423208
42922
42923
429325
LDA
#128
15
423429
41366
42835
#15
4164
447933
44422
44426
192
#127
98
92
4133
#167
34
35
44611
#183
#185
430.34
121
#169
42311
115
44426
48171
446008
4
73
4129
IS 11T
Bit 7 in (165) setzen, um Annahme von Integer—- und Feld-
„ariaklen z1ls Schleifemzsriskle zu verhindern
> LET definiert FOR-HEXT-"zariable, Pceinter nach 173.745
> Stack-Suchrautine zucht nach offener FOR-HEx-T-Schleife
mit dieser Yarisblen. Gefunden? Hein: weiter kei 424335
Stasckpointer auf alte Schleife setzen
Ruecksprungadresse Interpreterschleife entfernen
Zur Pruefung, ob Platz im Stack
> Wenn Stackrointer “ 868, dann DUT OF MEMORY
-
> nsaechstes Trermzeichen suchen, Offset im "FR
Offset zum CHRGET-Pointer sddieren,
ergibt Startadresse der FOR-NE#=T-Schleife
Startadresse lou zuf den Stack ablesen
Vebertra4y addieren
ebernscs hiah ur den Stack legen
Aktuelle Zeilennummer \cou
und
Aktuelle Zeilennmunmmer Hhiah
auf Stack lesen
ERSIC-Code fuer 7TO’
> SYHCHR prueft, ob dieser Code fo1yt
> FRMNUM pruestft, ok numerische Schleifen»ariskle faoalste
> FRMEYL wertet Ausdruck aus, Ergekni= nach FRC
Varzeichenkbyrte von FRL 37255 fuer +.7.—-)
Bit @ kiss & fuer AHD setzen
Bit @kis 6 im Accu mit Bits 9 kiz 5 von FRC „sleichmachern
Ergebriz als MS5B speichern. Bit 7 eryikt Yorzeichen
Ruecksprunaadresse 432591 fuer indirekten Sprımy
cval. 446295
nach 134.35> kringen
> TD-Mert zuf Stzack sblesen, dann zurueck nach 92391
Acc TR) = 47548, Startadresse (on
Ersatzwert 1 fuer "STEP’
> 1 als STEP-Hert nach FRC bringen
> EHRGOT holt letztes Zeichen
BRSIC-Code fuer ’STEP’?
Nein: kein STEFP-Wert angegeben, weiter kei 42311
> CHRGET holt naechstes Zeichen
> FRMEYL wertet Rusdruck aus, Ergehris nach FRC
> holt Vorzeichenkrte
> legt Worzeichen und STEP-Mert zuf Stack
FOR-HEXKT-VYVariablenzeisger lau,
FOR-NEXT-YVarisblenzeiger high
und
sbschliessend noch den Code fuer ’FOR’
auf den Stack legen
150
ceErnN 84 BRSIC VZ - - - - - - u nahe Drug =
Interpreter-Schleife,
32926
329239
32931
432933
42935
42938
12938
32944
12942
12944
412948
32948
ISR
LDA
LOY
CPY
NOP
BEQ
STA
STy
LDY
LDA
ENE
LDY
LOA
43052
122
123
#2
42942
51
62
+2
1229,Y
43215
#2
<122>.YV
42958
430933
c122)>,Y
Sr
aa”, T
gaar7z,Y
I,T
Routinenaufru?f
> RUNSTOP-Taste akfragen, evtl.
CHRGET-Pointer low,
CHRGET-Pointer hiah
= 2 <Direktmoadus>?
Rhkruch
Ja: weiter bei 42942
Zeiger fuer CONT
laufendes Zeichen
= 0? Neins weiter kei 43915
vekernaechstes Zeichen
= a (Programmende?>? Neins weiter hei 42958
> Programmlauf beenden
naechste Zei lennummer 1cau
nach 57)
naechste Zeilennummer high
nach 5393)
CHRGET-Pointer auf letztes Bute nach
neuem Zeilenkoprf setzen
NHormalwert des Vektors (7767777): 42984
> CHRGET holt naechstes Zeichen
> Interpretation und Routinenaufruf
> Zurueck zum Schleifenanfang
Trennzeichen? Ja: RTS
128 vom Zeichencode akziehen
cz @ kein BASIC-Befehl>? Jas LET, weiter bei 4J3a12
Code > 162 «NEW>? (182 — 128 = 35
Jas weiter kei 43422
Ergeknhis verdoppeln
als Pointerins YR bringen
Rdresse hish aus Tabelle
auf Stack legen
Adresse low aus Tabelle
auf Stack legen
> CHRGET holt naechstes Zeichen, RTS ruft Routine auf
> LET. weist Yariaklen einen Wert zu
Trennzeichen ":"7
Jar zurueck nach 42997
> "SYNTAX ERROR"
BARSIC-Code fuer ’G0”?
Nein: "SYNTAX ERROR"
> CHRGET halt naechstes Zeichen
BASIC-Cod> fuer ”TO”
> SYHCHR prueft, ob dieser Code falgat
> GOTO
151
CO Br
BASIC-Routine RESTORE
43437 SEC
43033 LDA
4304@ SBC
43042 LD’Y
43044 BCS
43046 DEY
43047 STA
43043 STY
43051 RTS
43047
late!
E&
+ >22 237
vom Prosr aım-Anfangspointer
eins suktrahieren
eraibt ODATA-Zeiger
BERSIC-Routiren END und STOP sowie Abfrage der RUNSTOP-Taste mit Akkruch
43052 JISF
43055 BCS
43857 CLC
43053 BNE
43980 LDA
43962 LDY
43064 LDX
43066 INK
4+30&7 BEQ
4308593 5TA
43071 STY
43073 LDA
43075 LDY
43077 STA
43073 STYT
43081 PLA
43052 FLA
43033 LDA
43955 LDY
43087 BCC
+3039 JIMP
43092 JMP
BASIC-Routire CONT
423495 BNE
43997 LDX
430899 LDOY
43181 BNE
43103 ITMP
43186 LORA
43108 STA
43110 ST'Y
43112 LDRA
43114 LDY
43116 STA
43118 ST'Y
43120 RTS
53505
43058
43120
122
123
=
43081
43120
#26
62
43106
42033
51
122
123
39
sa
57
58
> STOP prueft RUNSTOP-Taste
Einsprung fuer ’STOP”
Einsprung fuer END”
RUNSTOP-Taste nicht sedrueclkt? Ia: RTS
CHRGET-Fointer lau,
CHRGET-Pointer high
Zeilennummer high «255 im Direktmadus >”?
Direktmoadus? Ja: weiter kei 43as1
CHRGET-Pointer nach (51.62)
sktuelle Zeilennummer fuer CONT
in <39’60) aufbewahren
Fuecksprungadresse aus Stack entfernen
Accu YR3 3= 51857,
Start=dresse fuer "EBERERE"
Rufruf durch END? Ta: keine Russabe „an "BREAK"
> "BRERK"—-Meldung. RERD'T.
> Rusgsake "RERODY.". Eingakewarteschleitfe
Folgt Trennungszeichen?” Nein: "SYHNTAS ERROR" s
Code fuer "CRN’”’T CONTINUE"
’"CONT” gesperrt?
Neins weiter bei 43106
> Fehlermeldung, RERD!YT.
CHRGET-Pointer wiederherstellen
Zei lernummer wiederherstellen
152
cBri
=35IC-Routine RUN
«2121 PHP
s3122 LDR
«3124 ISR
3127 PLP
3128 BNE
x3130 JMP
«3133 ISR
13136 JIMP
F#SIC-Routime GOSUB
23139 LOA
23141 ISR
z232144 DA
231465 FHR
3147 LORA
43149 PHRA
«3150 LDA
23152 FHR
3153 LOA
23155 PHRA
3156 LDA
3158 PHR
43159 JISR
22162 ISR
33165 IMP
#SIC-Rautine GOTO
2:168 [SR
3171 TSF
423174 SEC
+5175 LDRA
413177 SBC
3179 LOA
23181 SBC
3183 BCS
12185 TYrA
23186 SEC
3187 ADC
43189 LD:
13191 BCC
23193 IN“
43194 BCS
23196 LOA
23198 LD“s
s2200 ISR
3203 BCC
22295 LOR
13297 5BC
23209 STR
43211 LOR
3213 SBC
2215 STA
43217 RTS
#0
53424
423133
42585
42392
43159
#3
41979
123
43371
43273
42
44
42519
43235
95
#1
122
36
#0
123
statusregister merken
> SETMSG, Rusaakemoadus Festlegen
folgt Tremnnunsszeichen? Nein: RUN mit Zeilernmummer
> CHRGET-Pointer ruecksetzen. CLR
> CLR
> CHRGOT, GOTO, Interpreter-Schleife
Zur Pruefung, cb Platz im Stack °
> Wenn Stackpeinter < 63, dann "GUT OF MEMORY"
CHRGET-Pointer hiah,
ÜHRGET-Pointer 1lou:.
Zei lennummer hiah,
Zeilennummer Ic,
und
akschliessend noch den Code fuer ”GOSURB”
auf den Stack
> CHRGET holt naechsztes Zeichen
> GOTO
> Interpreter-Schleife
> Zeilennummer hinter GOTG nach 7209”21> bringen
> Offset bis zum Ende der Zeile ins YR i
Aktuelle Zeilennummer mit Zeilennummer
nach "GOTO’ n»eraleichenr
Groesser: weiter hei 43196
Offset zum Zeilenende zum CHRGET-Pointer addieren
UInkedinater Sprung
Acc SR? ı= Pointer auf Progar ammanfang
> Startadresse der gesuchten Zeile nach (93796)
Zeile vorhanden? Nein: "UNDEF’D STATEMENT ERROR"
von der Startadresse der Zeile
eins suktrahieren
ergikt neuen CHRGET-Pointer. zeigt auf Null-Code
D 3
153
+2>2121
_Erf S5S4+ EBEASIC WwZ - - - - m - —ı 21:5
BASIC-Rautine RETURN
43218 BNE 43217 falast Trennzeichen? Nein: "SYNTARS ERROR"
43228 LDA #235
43222 STA r’4 FÜR-NEXT-YVarisaklenzeiger high zwangsweise definieren
43224 JISR 41366 > Stack-Suchroautine sucht nach nz=echstem GOSUR-Ostensatz
43227 TXS
43223 CMP #141
43230 BEQ 43243
"GOSUB”-Code sefunden”?
Ja: weiter kei 43243
43232 LD8S #12 Code fuer "RETURN WITHOUT GÜSUB"
43234 BIT u
43235 LDX #17 Code fuer "UNDEF”’D STATEMENT"
43237 JMP 42039 > Fehlermeldung, READY.
43240 IMPF 448309 > "SYNTAX ERRÜR"
43243 PLA "GOSURB’-Code vom Stack holen
43244 PLA Zeilennummer vom Stack
43245 STA I” nach {577337 krirmgen
43247? PLA
43243 STA 58
43250 PLA CHRGET-Pceinter vom Stack
43251 STA 122 nach (12271235 kringen
433253 PLA
43254 5TA 123
BASIC-Routine DATA
432565 ISR 43270 > Offset zum naechsten Trennzeichen feststellen
43259 TrA
43280 CLC CHRGET-Pointer auf naechstes Trennzeichen setzen
43261 RDC 122
43263 STA 122
43265 BCE 43269
43267 INC 123
43259 RTS R
Offset zum naechsten Trennzeichen feststellen
43270 LDS
43272 BIT
43273 LD«
43275 ST*
43277 LOY
43279 STY
43281 LDA
43283 LD*S
43235 STA
43237 STX
43239 LDA
43231 BEQ
43233 CMP
43235 BEQ
43297 INY
43233 CMP
433808 BNE
43302 BEQ
1223 ,Y
43263
8
43269
434
43289
43281
Trennzeichen zwischen Befehlen
Trennzeichen zwischen Zeiler
abspeichern
Zaehler initialisieren
3) ı=
Zeichen holen
Zeilenende? Ja: RTS
= (8)?
Ja: Yegebenes Trennzeichen sefunden, RTS
Index erhoehen:
Anfuehrungszeichen?
NHeins weitersuchen ...
Sonst erst (> und \&) vertauschen
154
cEnr
3ASIC-Routine IF
23304 JSR
3307 JSR
4331@ CMP
43312 BEO
43314 LDA
33316 JSR
43319 LOR
3321 BNE
43323 ISR
237326 BEQ
3328 JISR
ı3331 BCS
3333 JMP
13336 JMP
44446
121
#137
43319
#167
447939
97
43328
43273
43259
121
43336
43168
429333
SASIC-Routine ON
43339 ISR
43342 PHR
43343 CHMP
373345 BE®
3347 CMP
33493 BNE
«3351 DEC
3353 BNE
43355 PLA
13356 JMP
413359 JISR
«3362 JSR
2273655 CHMP
43367 BER
133569 PLA
23378 FRTS
43504
FRMEYL wertet Ausdruck zus. Ergebnis nach FRC
CHRGOT holt letztes Zeichen
BARSIC-Code Fuer ’7G0T0’?
Ja: weiter kei 43319
BASIC-Code fuer ’”THEN”
> SYNCHR prueft, ob dieser Code folgt
IF-Bedingung erfuesllt?
Ja: weiter kei 43328 .
> Offset des Zeilenendes ins "'R bringen
CHRGET-Painter auf naechste Zeile setzen
> CHRGOT halt letztes Zeichen
Ziffer? Nein: kein Sprunabefehl
> GOTO e
1 WW
> Interpreter-Schleife
> GETBYT krirgt Wert von 8 kis 255 nuch <101)>
letztes Zeichen merken
Code fuer ’"GOSUB”’?
Ja: weiter bei 43351
Code fuer ’G0OT0O’?
Nein: "SYNTAS ERROR"
Yarisablerwert verminderrı
Ergebnis = 97? Nein: weiter kei 43359
letztes Zeichen vom Stack halen
Ey
> Interpreter-Schleife, Routinenaufruf
> CHRGET halt naechstes Zeichen
> Zeilerrummer nach (24/21> bringen
Folst Komma?
Ja: weiter kei 43351
keine Sprungadresse „vorhanden
155
CceEer 5:4 BRSIC WwZ - - - - - -
Lesen einer Zeilennummer und Umwandlung in 18-Bit nach (20.219
Eingakes TIaufendes CHRGET-Zeichen im Accu, zugehcseriger Wert im Ststusregister
Rusgakbke: 3) wern erstes Zeichen numerisch:
Vlert der Zeilernnummer bis zum ersten nichtnumerischen
Zeichen in 165-Bit-Integer in (24/21>
k) wenn erstes Zeichen nicht numerisch:
20. 21> := 8
In beiden Faellen ist die Carrv-Fl=a93 Yyesetzt
+3371 LDS #0
43373 ST®& 2a szar'21> mit QO vorkesetzen
433753 STA 21
43377 BCS 43370 Zeichen numerisch? Nein: RTS
43379 SBC 447 »om ASCII den Wert 48 zuktrahieren (Carry = 1)
43381 STA ” .Ziffernwert merken
43383 LDA 21
43385 STR 34
43387 CMP #25 Ergebnis im zulaeszigen Bereich (d-63999)
43383 BCS 43347 NHeins im Normalfall "SYNTAX ERROR"
43391 LDA 28 kisher gelesene Zahl
43393 RSL mit 10 multiplizieren
43394 ROL 34
43396 ASL zweimal mal 2,
43397 ROL 24
43399 ADC za
423421 STA 2a
43403 LDA 34 plus vorherigen Wert,
43405 ADC 21
43487 STA 21
43499 ASL 2a und dann verdoppeln
43411 ROL 21
43413 LDA 2a
43415 ADC Y Ziffernwert addieren
43417 STA 28
43419 BCC 43423
43421 INC 21 liekertr393 =ddieren
43423 JSR 115 > CHRGET holt naechstesr Zeichen
43426 JMP 43377 > Zurueck zum Schleifenanfang
156
CcBr 24 EBRSIC
BRSIC-Rautine LET
43429
43432
43434
43436&
43438
43441
43443
43444
43446
43447
434508
43451
43452
43435
43457
43453
43460
43453
43466
43458
43470
43472
43473
43475
43477
43478
43481
43432
43434
33486
43439
33491
433493
43493
43497
433499
43501
43503
43506
43509
3511
43513
43516
43519
43520
43522
43523
33524
43927
33529
43530
43532
43534
3537
35408
3542
3544
: 3546
JSR
STA
sTYr
LDA
JSR
LOA
PHRA
LOR
PHR
JSR
PLA
ROL
JSR
BNE
PLA
BPL
JSR
ISR
LDY
LOR
STA
INT
LODA
STA
RTS
IMP
PLA
LO
CP'r
BNE
JSR
CMP
BHNE
LO
STr
sTYr
STYr
JSR
JSR
INC
LD'Y
JSR
JSR
TAX
BEQ
INS
TARA
JSR
LD'Y
INY
CP'Yr
BNE
JSR
JSR
LES
LDY
LDA
T’MP
45195
73
v4
#178
44799
14
13
44446
44432
42481
434783
43155
45543
#0
190
73>,YV
101
737 ,Y
> YARSUC sucht Yariakle hinter LET, oder leat sie ar
Yariaklenzeiger nach (73774) bringen
Code fuer "="
> SYNCHR prueft,. ok dieser Code folgt
Integer-Flas und
Strimna-Flz93 auf Stack retten
> FRMEYL wertet Rusdruck aus
Bei String ist die Carry-Flag gesetzt, sonst Yelocescht
> FRMNUM prueft, ob Ergeknis zum Yariaklentyp passt
String? Jar weiter bei 43481
Integer”?
Nein: weiter kei 43478
> FRC runden
> FLPINT wandelt Fliesskommazahl in 18-Bit-Integer
Brte hiah in Yariskle uvekertrasen,
Brte lcou in Yariakble vebertrasen
> Fliesskoammazahl aus FRAC in Yariskle uvebertr aygen
Yariaklenzeiger hiahı
= 191 <TI$, val. 45356 FF)?
Nein: weiter kei 439564
> FRESTR
Stringalaenge = 67
Nein: "ILLEGAL QUANTITY ERROR"
FRC initialisieren
> prueft auf Ziffer, addiert Wert zu FRC
> FRC := 18 % FRC
Stellenzaehler erhoehen
> prueft auf Ziffer, addiert Wert zu FRC
> RRG ı= FRC
FRC = 80? Ia:s weiter bei 43527
Expanent „on FRC erhoehen sentspricht FRC := FRC % 2)
> FARC := <ARG + FAC> %* 2
also insgesamt FRC := & %* FRC
Stellenzaehler erhoehen
= 6?
Nein: weitermachen ...
> FRC ı= 1A % FRC
=
> Fliesskomma in Integer umwandeln
> SETTIM, Uhrzeit setzen
157
CB5n ©4 BR=SIC
BRSIC-Rautire LET
43549
43551
43534
43556
43559
43561
43564
43566
43568
43570
43572
43574
43575
43577
435793
43531
43583
43585
43597
43599
43591
435393
43595
43597
43599
43602
43504
43606 .
43549
43611
43613
43615
43617 .
43620
43622
43624
43626
43628
43631
43633
43635
43637
43538
43640
43642
43643
43645
43647
LDA
JSR
BEE
345,7
123
43559
45644
#47
435160
#2
100) ,Y
cS0> ,Y
73 ,.Y
807 ,Y
73>,YV
(80) „Y
73) ,YV
Fartsetzung?
Zeichen aus String halen
> pruefen, ob Ziffer
Ja: weiter kei 433359
> "ILLEGAL QUANTIT'YT ERROR"
428 (Carry = BD) zuktrahieren
> Accu zu FRÜC scddieren
Startadresse high des String unterhalk des
Stringbereichs (<slso im Frosr smm)?
las weiter kei 43595
Groesser? Ja: weiter hei 423531
Startadresse low des String
mit Str ins-Anfangszeiger low vergleichen
kleiner <also im Proaramm>?” Ja: weiter kei 43395
Pointer hiyh auf Stringdescriptor
mit Pointer high auf Anfang der Yariaklen vergleichen
kleiner?” Ja: weiter kei 433395
Groesser?” Ja: weiter hei 43602
Pointer low zuf Stringadescripter
mit Pointer low auf Anfana der Yariaklen vergleichen
Groesser? Ja: weiter bei 436542
Acc’ R> = Zeiger auf Stringdescripteor
-
> bis 43624 vekerspr insen
Sstrinsalaerge
> Speicherplatz pruefen, Strinapointer setzen
cSa’g1> zeiat auf Strinrgdescriptor
> Strins in den Strinskereich uvekertrauen
Strinadescriptor steht in 37 ,...,.99)
> mit Pointer auf. letzten Descrirtor vergleichen
Strirgdescriptor als 5Strinaävarisklenwert in
Yarisklentsbelle kringen
158
CcEr 5:4 FRS5Ic zZ - - - - - -
BASIC-Routine PRINT#
4336493 JISR
43651 JMP
43654
43957
BRSIC-Routine CMO
43654
43657
43639
43661
43664
4336655
43667
43670
43671
ISR
BEQ
LDRA
IJSR
PHF
ST*
JSR
PLP
JIMP
47006
43664
#44
44799
19
Sr824
43698
BRRSIC-Roautine PRINT
436574 ISR
43677 JSR
Einsprung
BEQ
BEO
CHP
BEQ
CMP
CLC
BEQ
CHP
BEQ
CMP
BEO
JSR
BIT
BMI
ISR
JSR
ISR
ISR
BHE
43684
43682
43634
43636
43688
43690
43691
43693
43695
43697
43699
43701
43704
437065
43708
43711
43714
43717
43720
Abschluss
43722
43724
43727
43723
43731
43733
LOA
sta
LDS
LO
LOA
BNE
43309
121
fuer PRINT
43735
43751
#163
43763
#166
43768
#44
43752
459
43795
45605
46215
43303
43335
4367Y
#0
S1l2,#
4255
#1
12
43751
MD
>.!E
> CLRCH, Tastatur sktivieren
> GETBYT holt Filenummer
Folgt Trennzeichen? Ja: weiter kei 43664
Komma-Ccode
> SYNCHR prueft, ob dieser Code folgt
statusregister fuer PRINT merken
aktiver Ausgabe-Kanal
> CHKOUT mit Fehlerbehandlung
Statusresister wiederherstellen
> PRINT
> String drucken
> CHRGOT holt letztes Zeichen
Trennzeichen? Ja: weiter kei 437353
Trennzeichen “nach ’TRB’” und "SPC”’7? Jaı
BASIC-Code fuer ”"TRB’?
Ja: weiter bei 43768
BRASIC-Code fuer "SPE’?
Flag fuer ’SPC’” setzen
"SPC’-Code? Jar weiter bei 43768
Komma-Coade?
Ja: weiter kei 43732
Code fuer Semikclon?
’!as naechstes Zeichen lesen,
> FRMEYL wertet Ausdruck zus
str ing?
Ja: String drucken.
RTS
Schleifenanfang
Schleifenanfang
> FRCSTR, wandelt FRC in String ab (256) um
> String-Parameter holen
> String. drucken .
> ’CURSOR RIGHT” oder ”SPACE’” drucken
U
rnbkedingater Sprung zum Schleifenanfang
der Einyabewarteschleitfe
Eingabe-Puffer mit DB zabschliersen
CHRGET-Pointer auf 511 setzen
Aktiver Einaake-Kanal = Tastastur?
Nein: RTS
BRSIC-Rautime PRINT <Fortsetzung?
43735
43737
43748
43742
43744
43746
43749
43751
LOR
JSR
BIT
BPL
1_DA
SR
EOR
RTS
#13
4239347
193
43749
#10
439347
4255
Code fuer ’RETURN”
> Zeilenvorschuk drucken
Aktiver Eingake-Kanal < 1287
Ja: fertig
Code fuer ’"LINEFEED”
> Zeichen drucken
159
CE S4 BRSIC
Sprung zur naechsten vortabkulierten Positian
43732
43753
43756
43757
43758
437608
43762
43764
43766
SEC
JSR
TrA
SEC
SBC
BCS
EOR
ADC
BNE
65520
> PLOT, Cursaerpositicon lesen, Spalte im YR
davan zalange 10 szsuktrahieren.
kis Ergebnis negativ
Vorzeichen umdrehen
Zweierkomplement plus eins?
Unkedinater Sprung
Ausfuehrung won TRB und SPC
43768
43769
43770
43773
43775
43778
43780
437832
423733
43785
43786
437883
43790
43791
43792
43793
43795
43798
43801
43804
43306
43809
43312
43313
439815
43816
43317
43819
43821
43324
43325
43327
43329
438332
43835
439337
43839
43341
439842
439344
439345
439347
43350
43352
PHP
SEC
JSR
STy
ISR
CMP
BNE
PLP
BCC
TXA
SBC
BCC
TAX
INX
DEX
BNE
JSR
IMP
ISR
BNE
ISR
ISR
TAs
LDY
INS
DE*
BEO
LDA
JSR
INY
CMP
BNE
JSR
JMP
LDR
BEQ
LDR
BIT
LDR
BIT
LOR
JSR
AND
RTS
46215
46759
#0
43751
34
43847
2,WV
Fl393 fuer SPC (Carry = 8) merken
> PLOT, Curscorpesition lesen, Spalte im YR
Spalte merken
> GETBYT holt TAB /’SPC-Farsmeter ins #R
Folgt "3"?
Nein: "SYNTAX ERROR"
Carrv holen
SPC? Isa: weiter
TRB-Parameter
kleiner als aktuelle Cursorspalte?
bei 43721
Jas nichts ausgeken, fertig
Anzahl der Schritte kisr zum Takulator ins X&R
SR als. Zaehler initislisieren
sR vermindern
= 8? Neins "CURSOR RIGHT” drucken. zurueck nach 43792
> CHRGET holt naechstes Zeichen
> Sprung zum RAnfanas der PRINT-Schleife
> ’CURSOR RIGHT” oder ’SPRCE” drucken
Unbedinater Sprung
-
> Stringpsrameter holen
> FRESTR
Str inalaenge
Indirect-Pointer fuer Str imngausgake
fertig gedruckt? Jas RTS
Zeichen aus String holen
> drucken
War Zeichen ein ’CR’?
Nein: zurueck nach 43816
> EOR #255 6795
> zurueck zum Schleifenanfang
Rusgakbe ueber logisches File?
Neins "CURSOR RIGHT” statt SPACE”
Code fuer ”SPRCE”
drucken
Code fuer "CURSOR RIGHT”
Code fuer "7?"
> CHROUT mit Fehlerbehandlung
statusflags setzen
160
cern
+ FRARSIC WVZ - - - - - -
+35
Zehlerbehandlung kei INPUT. GET und RERD
3853 LOA
333855 BEQ
43857 BMI
+3859 LDY
43861 BNE
43363 LDA
43365 LD'Y
43867 STA
43369 STYr
+33871 JIMP
33374 LDA
33376 BEQ
33878 LDXS
43380 IMP
3883 LOA
43385 LDY
+23387 ISR
413890 LDR
333892 LD'Y
43894 STA
33336 STY
43893 RTS
SRSIC-Rautine GET
43899 JSR
43902 CMP
43904 BNE
39065 JISR
43909 ISR
43912 LDA
43914 JSR
33917 ST®
33919 ISR
433922 LOS
33924 LDY
43926 LDA
433928 STA
43931 LDA
43933 JSR
33936 LDX
33938 BNE
33948 RTS
SRSIC-Rautine INPUT#
43941 JISR
33944 LDR
43946 ISR
43949 STAR
43951 ISR
43954 JSR
43957 LOR
43959 JSR
43962 LD%s
43964 STS
439656 RTS
17
43874
43363
#255
43367
53
&4
357
58
44308
13
43333
#24
42039
#12
#173
433086
&1
SE
122
123
459398
#35
43922
115
4700&
#44
447993
19
Sr6834
#1
#2
#0
13
#64
4447
19
43959
47006
#44
44799
Fla9 fuer INPUT (=). GET (=64>, RERD (=152)
INPUT: weiter kei 43874
RERD: weiter bei 439353
GET:
Unkedinster Sprung
DATR-Zei lennummer
als Zeilennummer fuer Fehlermeldung speichern
> "SYNTAS ERROR"
Eingabe ueber File?
Nein: "REDG FROM START"
Code fuer "FILE DATR"
> Fehlermeldung, RERDY.
Accu/YR> ı= 44300, Startadresse fuer "REODO FROM START"
> Fehlermeldung drucken
CHRGET-Pointer auf INPUT zuruecksetzen
> Falls Direktmodus,. "ILLEGAL DIRECT ERROR"
Folgt '%"7?
Nein: weiter kei 43922
> CHRGET holt naechstes Zeichen
> GETEYT holt Filenummer ins XR
Komma-Code
> SYNCHR prueft, ck dieser Code folst
Filenummer
> CHKIN, Eingabevaorkereitung
Eingskezeiger auf 313 setzen
Endezeichen nach 513, da nur ein Zeichen geholt wird
Fl39-llert fuer GET
> halt Zeichen und krinst Code in Yariakle
Eingabe ueber File?
Jas CLRCHN, Tastatur aktivieren
> GETBYT krinat Filenummer ins XR
Komma-Code
> SYNCHR prueft, ok dieser Code folst
Filenummer
> CHKIN, Eingabevorkberei tung
> INPUT ohne Dialog
Filenummer in Rccu
> CLRCHN, aktive I/O-Kanasaele schliessen
Tastatur aktivieren
161
CO Br
BASIC-Rautine INFUT
43957
43969
43971
43974
43976
43979
423932
43985
43937
43990
43993
43995
43997
440008
448982
44984
44997
44018
44813
43015
44917
44019
44822
44025
44027
44029
44932
44035
BASIC-Routine REROD
44038
44940
44942
44944
44945
44047
44049
440951
44953
44056 !
44058
44060 |
44062
44064
440665
44068
44070
44872
44074
44076
44979
44081
44033
44035
44988
44091
44093
44095
= RESASTLIC
CMP
BNE
JSR
LDR
JSR
JSR
SR
LODR
STR
ISR
LDA
BEQ
JSR
RHOD
BEO
JSR
JMP
LDR
BNE
LDA
BNE
JSR
JMP
LDR
BNE
JSR
JSR
JMP
LDS
LDY
LDRA
BIT
#34
43932
44733
#59
44799
43809
Folat Anfuehrungszeichen?
Nein: weiter bei 43932
> Dialogstrirnrg erfassen
Code fuer Semikolan
> SYNCHR prueft, ck dieser Lode folgt
> Dialogastring drucken
> Falls Direktmodus, "ILLEGAL DIRECT ERROR"
Komma-Code
nach 311
> evtl. "?" drucken, lekeraabke an Eingabewarteschleife
Eingske ueber File?
Hein: weiter kei Jd4ald
> RERDST, Status lesen
Bit 1 (Timeout Read) isolieren
seloescht?” Ja: weiter kei 44018
> CLRCHN, Tastatur aktivieren
> DATA, Proaramm nach naechstem Trennzeichen forsetzen
Erstes Zeichen aus Eingakepuffer = B “keine Einyake>?
Nein: Eingabketext durch "RERD” verarkeiten
Eingabe ueber File”?
Jas nochmal probieren, zurueck nach 43998
> Offset zum naechsten Trennzeichen feststellen
> CHRGET-Pointer auf naechsten Befehl setzen
Eingske ueher File?
Tas "INPUT ohne "?", weiter kei 44035
> Fragezeichen drucken
> ”SPRCE” drucken
> Eingabeusarteschleife
DATA-Zeiger
Flaswert fuer RERAD
Flagwert fuer INPUT
Flag setzen
Eingskezeiger auf Eingasbesuelle setzen
> YVARSUC sucht Variable ader least sie an
VYariaklenzeiser nach (73774)
CHRSET-Pointer
nach (75/76) kringen
Eingabezeiser
nach CHRGET-Pointer kringen
> EHRGOT holt Zeichen aus Eingabesweille
Endezeichen? Neins weiter kei 44113
INPUT/GET /RERD-F 139
GET?- Neins weiter bei. 44997
> CHRIN holt Zeichen vom aktiven Eingake-Kanal
Zeichencode nach 3512
cKR/YVR> = 511
Unkedingater Sprung
162
cBnr
SASIC-Rautine RERD <Fortsetzung)
44097
34899
44101
34103
44106
441893
44111
44113
44118
44118
44120
44122
14124
44125
44127
44129
44131
44133
44135
44137
44133
44141
44142
44145
44146
44143
44150
44152
44154
44156
44157
44160
44163
44166
44159
44172
44174
44177
44180
44182
44134
44136
44139
414191
44193
44195
44197
44192
44201
44203
442053
34208
14210
44213
BMI
LDR
BNE
44216
19
44106
> BRrRSIc W222 = = = = = =
RERD? Ja: weiter hei 4d421s6
Eingske ueber File?
Jaı weiter kei 44196
> "7% drucken (falls zu wenige Einsaken kei 7”INPUT”>
SR
JSR
STH
sTYr
’SR
BIT
BFL
BIT
BVC
INS
ST“
LDA
sTtA
BEU
STR
cHmPp
BEQ
LDA
sth
LDA
CLC
STA
LDRA
LDY
ADC
BCC
INY
JSR
JSR
JSR
JMP
JSR
LOA
JSR
ISR
BEQ
CMP
BEQ
IMP
LDA
LO
STA
STY
LDA
LDY
sta
STTr
ISR
BEQ
JSR
JMP
43345
44025
122
123
115
13
44169
17
44123
122
> Eingake-Warteschleife
CHRGET-Pointer auf 511 setzen
> CHRGET holt naechstes Zeichen
Str inga-Yariakle”?
Nein: weiter kei 44169
. GET?
Nein: weiter kei 44133
CHRGET-Pcointer zuf 512 setzen
Trennzeichen
Unkedingter Sprung
Code des naechsten Zeichens
Anfuehrungszeichen?
Ja: Carrv = 1, weiter kei 44146
Code fuer ":", Endezeichen fuer Str inauebertr agung
Komma-Code. Endezeichen fuer Stringuebertr a9ung
CHRGET-Pointer bei Anfuehrungszeichen um eins erhoehen
String vekertrasen
String-Ende+1 in CHRGET-Pointer kringen
Stringdescriptor <Variaklenwert?> in Yariaklentabelle
kis. 44177 ueberspringen -
By Zu ZEV zu
> STRFAC, wandelt String..in Gleitkommazahl um
Flag fuer Integer
> FRC in Variable uebertragen
> CHRGOT holt letztes Zeichen
Trennzeichen?” Ja: weiter kei 441839
Komma-Code”
Ja: weiter bei 441893
> Fehlerkehandlung
CHRGET-Pcointer
Eingabezeiger auf naechstes Datum
CHRGET-Pointer
wiederherstellen
> CHRGOT holt letztes Zeichen
Trennzeichen? Ja: weiter bei 442553
> CHKCOM prueft, ok Komma folgt
> Zurueck zur Einsakbe, falls weitere Yarisaklen
163
++,”
CB 5:4 EBHSIc zZ - - -
BRARSIC-Rautine RERD “Fartsetzung?
44216 JISR 432708 Offset zum naechsten Trennzeichen ins YR
44219 INY
44220 TAX
44221 BNE 44241 Zeilenende? Nein: weiter bei 44241
44223 LDX #13 Code fuer "QUT GF DATA"
44225 INT
44226 LOA 122>,Y Linkpcinter hiah
44228 BEQ 44333 = 0? Ja: Fehlermeldung
4423 INY
44231 LDA l22>,\Y Zeilennummer 1cu,.
44233 STA 53
44235 INY
44236 LOA 122>,7T Zeilennunmmer hiah
44239 INY
44239 STA &4 nach (683764) bringen
44241 ISR 432593 CHRGET-Pointer um YR erhoehen
44244 TSR 121 > CHRGOT holt letztes Zeichen’
44247 TA
44248 CPX% #131 BRSIC-Code fuer DATA?
44250 BNE 44216 Nein: weitersuchen ...
44252 IMP 44113 > Dateneinygzke fortsetzen
44255 LOA 57 Eingabezeiger
44257 LOEY 88
442593 LD%S 17 INPUT GET /REARD-F 139
44261 BPL 2 44266 RERD? Nein: weiter bei 44266
44263 JMP 43047 DATR-Paointer := Einyabezeiger
4426 LDYV #08
44288 LDA (E72) ,T Naechstes Zeichen im Puffer
44270 BEQ 4428983 = Endezeichen?” Ja: RTS
44272 LDA 19 zu,viele Daten: Eingaake ueker File?
44274 BNE 44233 Ja: RTS
44276 LDA 4252 Accu/YR> ı= 44294, Startadresse von "EATRR IGNORED"
44273 LDY #172
44250 JIMP 439306 > Meldung drucken. FTS
44233 RTS
Fehlermeldungen fuer INPUT
442384 63 859 88 54 S2 65
44291 73 71 75 793 83
44300 63 82 69 65 79 32
44306 vo 982 79 v7’ 32 83 84 65 82 S4 13
164
?EXTRA
IGNORED
?REDA
=) FROM START
cEBErn S4+ BHSIc WW - - - - - - +31
BASIC-Routine NEXT
44318 BNE 44324 folgt Yarisakle? Iaı weiter hei 44324
44320 LDY #0 Yariaklenpointer high ı= A Lugl. 41878)
44322 BEQU 44327 Unkedinster Sprung
44324 ISR 45195 > YARSUC zucht Variable
44327 STA ‚3 Zeiger nach (73774)
44329 STY v4
44331 ISR 41866 > Stacksuche nach zusehcerigem FOR-NEXxT-Datensatz
44334 BEQ 44341 Gefunden? Jas weiter bei 44341
443365 LD% 410 Code fuer "NEXT WITHOUT FOR"
34338 JMP 42039 > Fehlermeldung, READY.
44341 TXS
414342 TARA
44343 CLC
44344 ADC #4
442346 PHA Zeiger auf Exponenten des STEP-Werts
414347 ADC #6
44349 STA 3& Zeiger auf Expanenten des TO-Werts
44351 PLA
44352 LOY #1
44354 JSR 43034 > STEP-Wert nach FRC kringen
414357 TS5%
44358 LOR 269,8 VYorzeichenkyte
44361 STA 1a2 nach <182> krinsen (VYoarzeichenkvte fuer FRC)
44363 LDA 23 FÜR-NEXT-Yariaklenzeiger nach ÜRAccu’YR)
143685 LD'Y v4
44367 JSR 4r207 > STEP-Wert zum FOR-NEXT-Yariaklenwert sddieren
44370 ISR 2 48a30 > Ergeknis in FOR-NEXT-Yariable vekertrasgen
34373 LD'Y #1
34375 ISR 48221 > FOR-NEX&T-VYarisklenwert mit TO-biert vergleichen
14373 TSX
4143793 SEC
414380 SBC 285.8
434333 BEQ 44408 Groesser : FOR-NEXT-Schleife verlassen
44335 LOA er1,8 Zeilennummer des Schleifensnfangs aus Stack
34338 STA 57 nach (57758) kringen
34390 LDA 272,8
34393 STR 58
44335 LOA 274,X% Schleifenanfzena in CHRGET-Painter
14393 5TA 122
3440@ LOA er73,#
414493 STA 123
34405 IMF 423265 > Interpreterschleitfe
444A8 TAR
44409 ADC #17 Daten fuer FOR-NEXT-Schleife
44411 TAX aus Stack entfernen
34412 TXS
44413 JSR 121 > CHRGOT holt letztes Zeichen
344165 CMP #44 Komma-Clode”
44418 EBENE 44405 Hein: Interpreterschleife
44420 ISR 115 CHRGET holt naechstes Zeichen
. \ „?
44423 JISR 44324 Naechste FOR-NEXT-Yariakle bearbeiten
’ISR”’” fuer Stacksuche (val. 41866 ff),
e=z erfolgt kein zugehoeriges ’RTS”
165
cC-Brn S4+ RBRrAsSliIc v2 5 - z 5 = = Ps WE BD er)
Auswertung und Pruefung van Rusdruecken
44426 ISR 44dds > FRMEVL
44429 CLC Kennzeichnung fuer Test auf numerisch
44430 BIT a
44431 SEC Kennzeichnung fuer Test auf Strina
44432 BIT 123 Flag fuer String gesetzt?
44434 BMI 44439 Jas weiter kei 44439
444365 BCS 2 44ddı falls Carry gesetzt «Test auf String>,. TYFE MISMATCH
44438 RTS
444239 BCS 444383 falle Carry gesetzt, RTS
44441 LDS #22 Code fuer "TYPE MISMRATCH"
44443 IMP 42039 > Fehlermeldung, READ'T.
Ruswertung von Rusdruecken
44448 LDX 122 CHRGET-Pointer
44443 BNE 44452
44450 DEC 1223 um eins zuruecksetzenr
44452 DEC 122
44454 LDS #0
44456 BIT ee
44457 PHA Retten der Operatormaske
4445593 TXSA
444539 PHRA und Retten des Prioaritaetswerts auf den Stack
44450 LDA #1
44462 ISR 41979 > Falls Stackeointer < ed, darn "GUT OF MEMORY ERROR"
444685 ISR 44675 > naechstes Element der Ausdrucks auswerten
444658 LDA a
44470 STA ’7 Operatormaske loeschenr
44472 ISR 121 > CHRGOT holt letztes Zeichen
44475 SEC
44476 SBC #177 vom Operatarcode 177 zukbtrahieren
44478 BCC 44503 < 0? Ja: weiter kei 44503
44432 CMP #3 >= 3 (also Code >= 1895?
44482 BCS 44503 Jas kein Zeichen von 177 kis 179 (>=<S). weiter kei 44503
44434 CMP #1 Hier erfolat der Zusammenkau der Operatarmaske in den
444385 ROL Bits &© kis 2 in (77), wenn Codes im Bereich „an 177 bis
44437 EOR #1 kis 179 folgen. Es eryeken sich folgende Mcealichkeiten:
44433 EOR ’r’
44491 CMP Yr Relation I > I = I}= I < I<d> I<= lsanst
44493 BCC 44592 77) ı1ı ı2ı3193 15 16 a
44495 STA Y’v
44497 JISR 115 > CHRGET holt naechstes Zeichen
4450a JMP 4 44475 > naechstes Zeichen der Operatarmaske auswerten
44503 LD} ’v Operatarmaske
44505 BNE 44551 = 8? Nein: weiter kei 44551
44507 BCS 44632 Mar Cade >= 1887 Ias weiter kei 44632
44509 RDC #7 Mar Code < 170?
44511 BCC 44632 Jas weiter kei 445832
44513 ADC 13 Stringsadditian?
44515 BNE 445204 Nein: weiter hei 44520
44517 IMP 46653 > Strinwverknuepfung
44520 ADC %255 Code wiederherstellen ‘Carry wurde addiert. „gl. 445139
44522 STA 34 34) ı= Code — 178 ü+,-,%,7,T,RND,OR>
44524 ASL nerdoppeln
44525 ADC 34 und <34) addieren, also mit drei multirlizieren
44527 TAY als Zeiger ins YR
44528 PLA Prioritsetswert der vorherigen Operation
44529 CMP 410883,Y mit Prioritaetswert des momentanen Operatoars veraleichen
44532 BCS 44637 kleiner? Neins weiter kei 44637
166
cBnN S4+4 PBHRHSIc
Auswertung
44534
44537
44533
414541
44542
44544
44546
44547
44549
44551
414553
44554
44555
4145537
14559
434561
44563
+4565
14567
434569
44572
44574
44576
44579
44530
44583
+45934
44537
14589
+4592
34595
44597
$4500
44601
14602
34604
44506
44507
44609
$4610
4611
14614
34616
44617
445613
146208
44522
14623
44625
44626
44628
44629
44632
44624
14635
JSR
PHR
JISR
PLA
LD'
BPL
TA«
BEN
BNE
LSR
TARA
ROL
LD«
EBENE
DEC
DEC
LD'Y
STA
BNE
CHP
BCS
BCC
LDA
PHRA
LOA
PHA
JSR
LDA
IMP
JMP
LOA
LOS
TA'Yr
PLA
STR
INC
PLA
sSTA
‚"TrR
PHR
JSR
LDRA
PHR
LDR
PHR
LDA
PHR
LDA
PHR
LORA
PHR
JMP
LD'Y
PLA
BEQ
von Rusdruecken (Fortsetzung?
444293
445283
41033,'Y
44546
44537
41090 ,'Yr
41039,
44595
77
44457
448098
102
410938 ,Y
34
24
> FRMNUM prueft auf rumerisch
Prioritsetsflag auf Stack legen
> Operatar-Routinenadresse + Operand auf Stack, Rekursion
Operator?
Ja: weiter bei 4453693
noch offene Operatianen?
Neins Exponentkyte von FRC in Recu, RTS (Auswertungsende>
RARRG vom Stack holen
Bit 7 im Stringa-Flag loeschen
Operatormaske
um eine Stelle nach links verschieben
CHRGET-Pointer
um eins zuruecksetzern
Offset „con Priaritsetswert fuer >=<C
als neue Operatormaske speichern
LInbedingter Sprung
<Accu> mit Prioritaetsfla9g vergleichen
Groesser? Jar weiter bei 444
sonst weiter auswerten
Rdresse hish der Operatorroutine
Adresse low der Oper=atarroutine
> Operand zuf Stack legen
Operatormaske laden
und zurueck zum Rautinenanfana
> "SYNTRAS ERROR"
VYozeichenkyte von FRC
Prioritsetswert fuer Dperatior
Ruecksprungadresse vom Stack holen
und um eins erhoehen “nur low!)
Vorzeichenbkyte von FRC
auf Stack legen
>» FRC runden
FRC auf Stack ablegen
> Indirekter Sprung
Flagwert fuer fehlenden Operator
Prioritaetsflag
= 8? Jas weiter kei 44672
167
CO Br
> SHSIc zZ - - - -
Auswertung von RAusdruecken (Fortsetzuna?”
44637
4465393
44641
44644
44546
44647
44648
446530
446531
44653
44854
44656
44657
44659
44660
44662
44563
44665
446866
44658
44670
44672
44674
CHMP
BEO
JSR
STTr
PLA
LSR
STA
PLA
sTtA
PLA
STR
PLA
sSTA
PLA
STA
PLA
STA
PLA
STR
EOR
STA
LDA
RTS
Naechstes
44675
44678
44698
44632
44685
446587
44699
44693
44695
44598
44790
44782
44704
44706
44709
Gleitkommakonstante PI
JMP
LDRA
STA
JSR
BCS
I’MP
JSR
BCC
JMP
CMP
BNE
LDRA
LDY
JSR
JMP
1308
CHMP
BEO
CMP
BEQ
CMP
BEQ
CHMP
BNE
#100
44644
44429
75
111
97
79)
#0
13
115
44590
43371
45331
44698
44840
#255
44717
#168
4174
48034
115
v3 15 218 161
#46
44687
#171
44313
4170
44692
#34
44748
Priaoritaetsflag fuer (=>?
Ja: weiter kei 44deadd
> FRANUM prueft zuf numerisch
Fla93 fuer Operator
ARG vom Stack holen
VYarzeichen von ARG mit Vorzeichen „an FRAC verknueptfen
Expanentbyvte var FRAC
Element auswerten
Normalwert des Yektaoars 1778.77 9) 3:
Str ina-Fla9 ruecksetzen
> CHRGET holt naechstes Zeichen
Ziffer?” Nein: weiter bei 445890
> Wert der folgenden Zahl nach FRC
> prueft, ck Buchstake folgt
folgt Buchstabe”?
Jas weiter kei 44344
BASIC-Code fuer PI
Nein: weiter kei 44717
44670
Accw’YR) ı= 44712, Startadresse fuer Fliesskommazahl PI
> Konstante FI in FRC bringen
> CHRGET halt naechstes Zeichen
3.14159265
Code fuer Dezimalpunkt?
Ja: Wert der folasenden Zahl nach F
Code fuer "-"?
Jas weiter kei 44813
Code fuer "+"?
Jaı Zeichen ignorieren, weiter kei 44682
Code fuer Anfuehrungszeichen?
Neinsı weiter kei 44748
168
AC
Br S4 BRSIC W222 - - - - - -
waechstes
4733
14735
44737
147393
241741
414742
14745
14748
141750
14752
14754
14756
14759
11761
141753
3764
1756
14768
4771
14773
14775
241778
14780
14782
11785
14738
44731
LDA
LD'Y
ADC
BCC
INY
JSR
JMP
CMP
BHE
LOW
BNE
JSR
LDR
EOR
TAY
LDA
EOR
JMP
CMP
BNE
IMP
CHF
BCC
JMP
ISR
JSR
LOA
BIT
LDA
BIT
LOA
LD'Y
CMP
BNE
IMP
LD*S
JMP
LD'Y
PLA
PLA
JMP
SEC
LDA
SBC
LDA
5BC
BCC
LODR
SBC
LDA
SBC
RTS
#24
44315
45503
ıa1
4255
190
#255
4539693
#165
44778
450683
4184
44785
44967
44794
44446
#41
440
444
40
.122>,Y
44303
115
#11
42039
#21
+47 33
Element auswerten (Fortsetzung?
um eins erhoehten CHRGET-Pcinter
<Carryv = 1> nach (Accw’YR) bringen
> String in Stringkereich transferieren
> CHRGET-Fointer hinter Stringende setzen
BASIC-Code fuer NOT?
Nein: weiter kei 44771
Offset fuer Priorit=zetswert in Takelle
Unkedingter Sprung
> FLPINT wandelt Fliesskommazahl in 16-Bit Integer um
Integer invertieren
= INTFLP wandelt Integer in <Rccw’YR> in FLP in FAC um
BRSIC-Code fuer ’FN’”?
Neins weiter bei 447783
> FN. Funktionsauswer tung
Funktion CInterpretercodes von 188 kis 282)?
Nein: weiter bei 44785
[y
> Berechnung „on Funkticnen
> prueft, ob "cc" folgt
> FRMEVYL wertet Klammer ausdruck aus
Code fuer ">"
[ode fuer "«C"
[ode fuer ","
mit 12aufendem CHRGET-Zeichen vergleichen
Ungleich? Ja: "SYNTAX ERROR"
> CHRGET halt naechstes Zeichen
Code fuer "SYNTAX ERROR"
> Fehlermeldung, RERDY.
Offset auf Prioritaetswert fuer Yorzeichenwechsel
> Zurueck in Auswertungsroutine
Zeigt Yarisablenpcinter auf Bereich von 489609 kis 582737?
Nein: RTS
169
OBN &ı+ BSH>SIc Vz - en - = = e +5 40
Naechstes Element suswerten (Fartsetzung?
44340 ISR 45195 = YARSUC., sucht Yariakle “kein Anlegen!, val. 45341 Fr)
44343 STA 109 Fointer auf Yariakle’Descriertor nach (194/191)
442345 ST'Y 101
44347 LDXS 69 69/70) enthzaelt Namen der Yariablen
443493 LDY 70
44851 LDA 13 strinwariskle?
44353 BER 44593 Nein: weiter kei 44893
44355 LDA #40
44857 STA 112
44359 ISR 449328 > Zeigt Yariaklenpointer auf Bereich von 40984 bis 58273?
448862 BCC 445392 Nein: RTS
44364 CPX #34 Stringvariakle ’TI$”?
443866 BNE 448392
44868 CP'Yr 4201
44870 BNE 44892 Neinı RTS
44872 ISR 44932 > Uhrzeit nach FRAC kringen
44975 STY 94 94) ı= a «Flags fuer Exponentisaldarstellung
44877 DEY von Zahlenstrings loeschen?
448373 STY 113 113) ı= 255 «“Peinter fuer Startadresse des Strings?
44830 LOY #&
44882 STY 933 Anzahl der Stellen des Strings
448834 LDY #36 Pointer auf Stellenwerte zur Berechnung „can TI$
449886 JISR 48744 > Striny erzeugen
443839 JMP 46191 > krinat String in Strinabereich
44892 RTS
44393 BIT 14 Inteser-VYariable?
448953 BPL 44918 Nein: weiter kei 44918
44397 LD'Y %0
44399 LDA <100) „'r Wert der Inteser-Variaklen
44991 TAX
443082 INY
44903 LDA 19a) ,'Y aus der Yariaklen in FRC bringen
44305 TAY
44906 TARA
44397 IMP 45969 > INTFLP wandelt Integerzahl in. Fliesskommazahl um
44910 JSR 44828 > Zeigt Yariaklenpointer auf Bereich Von 40I6A kiss 583273?
44913 BCC 44968 Neins weiter kei 449608
44915 CPx 434 erstes Zeichen des Yariaklennamens = "T'"?
44917 BNE 44946 Nein: weiter kei 44946
44919 CPY #73 Yariakle ’TI’?
44921 BNE 44960 Nein: weiter kei 44968
44923 JSR 44932 > Uhrzeit nach FRÜC kringen
44926 TYR Accu? = 08
44927 LDX #168 Expanentkyte fuer FRC P
4492939 JMP 48207 > FRC aufbereiten und linkskuendig machen
44932 JSR 65592 > RDTIM liest Uhrzeit
44933 ST*X 100 nach FRC uekertrasen
449337 STY 939
44939 STR ıa1
44941 LDY #8
44943 ST'Y 938 98) = B
44945 RTS
170
C-PM SI BRSIC zZ - - - - - - un Le 2 2
Ruswertung von Rusdruecken <Fortsetzung?
44946 CPX #33 erstes Zeichen des Yariaklennamens = "SS"?
44943 BNE 449608 Neins weiter kei 44964
44930 CPY #84 Yariable ’7ST”"?
44952 BNE 44960 Nein: weiter kei J4964
44954 JSR 85463 > REARBDST liest Statusvariable
44957 JIMP 4898188 > Statusbyte nach FAC bringen
44960 LDOA 194 <Accu/yYR) se Feinter auf Yariakble
44982 LD'Y 101
449654 IMP 48034 > Mariakle nach FRC kringen
Aufruf von Funktionen
4493687 RSL BASIC-Cocde verdoppeln (AND 32557
44958 PHRA
44969 TAX
4497a TSR 115 > CHRGET halt naechstes Zeichen
44973 CP #143 BASIC-Code < zaar (143 + 256 + 1 = 20a %* 25
44975 BCC 45009 Ja: weiter kei 45049
"LEFT$’”, "RIGHT$”. ”MID$”
44977 ISR 44794 > prueft, ob "«" falat
4495QA ISR 44446 > FRMEVYL wertet Ausdruck aus
449833 JSR 44797 > CHKCOM prueft, cb Komma folst
44995 ISR 44431 > FRMNUM prueft, ob Stringvariakble
44983 PLA
449390 TAX
449931 LOA 101 Adresse des Strinasdescriptors
44993 PHA
443934 LDA aa
449936 PHA
44397 TXA BARSIC-Coade # Z <RND #25 auf Stack retten
449933 PHA
449339 ISR 47006 > GETBYT kringt zweiten Parameter ins XR
45002 PLA
35093 TAY BRSIC-LCode fuer Funktionsroutinenaufruf ins YR
45004 TAÄR
450905 PHA zweites Argument auf Stack
35aR& JIMP 45014 > Funktionsroutinenaufruf
45003 JISR 44785 > wertet Klammer ausdruck aus
45912 FLA BASIC-Code fuer Funktionsroutinenaufruf ins YR
45913 TAY
45014 LOAR 4a93S,Y Startadresszse der Funktion nach (33.36)
45017 STR 35 kringen (in 84 steht der Code fuer JMP)>
45019 LDA 44939,'Y
45022 STA 36
45024 ISR 84 > Funktionskerechnung
<Rueckkehr nur bei Funktionen mit numerischen Resultat)
45027” JMP 44429 > FRMNUM prueft, ob numerisches Ergeknis
Rusfuehrunga von RAND und OR
459030 LDY #253 Einzprung fuer ’OR’
45032 BIT ei
45433 LOY #0 Einsprung fuer ’AND”
45035 STYr 11 Flas fuer "AND” oder ’OR’” setzen
450937 JSR 45503 > FLPINT wandelt FRC in 16-Bit Inteser nach “10071017
171
CC EBr1
er BASIC WW - - - - - -
Rusfuehrung von AND und OR «Fortsetzung?
4Sa4u
45a4Z
45044
45046
45043
45058
45052
45955
45958
45958
45062
4554
45066
45a67
450659
4571
45073
45975
Rusfuehrung won =>
45078
45081
45033
45985
450987
45939
45091
45093
45995
45998
45099
45102
45194
45106
45188
45111
45113
45115
45117
45119
45121
45124
45126
451283
45129
45139
45132
453134
453136
45138
45140
45142
45144
45146
45147
45143
45149
45151
45153
LDRA
EOR
STR
LDA
EOR
STR
JSR
JSR
LDR
EOR
AND
EOR
TAY
LOA
EOR
AND
EOR
JMP
JSR
BCS
LDA
ORR
AND
STR
LDA
LDY
JSR
TAX
JMP
LDA
STR
DEC
JSR
STR
sTt*
sSTr
LDA
LDY
JSR
sT*
STY
TAs
SEC
SBC
BEQ
LDRA
BCC
LDXS
LDA
sSTA
LDY
IN
IN'Y
DEX
BNE
LDXS
BMI
130
11
r
101
11
3
45124
45503
121
44432
45192
>= FRC ı= RARG
> FLPINT wandelt FRC in 165-Bit Integer nach (100161 >
> INTFLP wandelt Inteser in FLP in FRC mit Yorzeicher
> Prueft. ok richtiser Yariaklentvp
String? Jar weiter bei 451092
ARG in Speicherformat umwandeln
Acc YR> := 195, Adresse won RARG
> vergleicht FRC mit ARG
> krinst Wahrheitswert (8 ader —-1> nach FRC
str ings-Fl39 zuruecksetzen
Operator -Maske
> FRESTR
97) ı= Stringlaenge
93’) ı= Startadresse des ersten Strings
Zeiger auf zweiten Strina
> FRESTR “mit Descriptorpcinter in \Accw"rYR?)
Startadresse des zweiten Strings nach ©108.’109)5
Laernge des zweiten Strinas im #R merken
Zweiter String genzusc lang wie erster ı weiter bei 43142
Flaqwert fuer ’erster String laenger”
zweiter String kuerzer: weiter kei 45142
Laenge des ersten Strings
Flagawert fuer ’erster String kuerzer”
Flags fuer Wahrheitswert, falls Strings kis zum letzen
Zeichen des kuerzeren Strings identisch, jedach
verschieden 12an9 sind.’
Beide Strings Zeichen fuer Zeichen vergleichen
172
+ TeIH
c- Br
SI BHSIc Vz - - - - - - +1
RAusfuehrung von “=>, Vergleich zweier Strings (Fortsetzung?
®
451595
45156
45158
451608
45162
45164
45166
45168
45170
45171
45172
45173
45175
45177
45177
Verwaltung
45182
CLC
BCC
LDA
CMP
BEQ
LOS
BCS
LD*S
IN“
TA
FROL
AND
BEQ
LOR
J’MP
JSR
45170
<1a8),'Y beide Strings zeichenweise vergleichen
93937 ,Y
45147 Gleich?” Jar weitermachen .„..
#255 Yergleich sbschliessen
45170
#1
18
45179
4255
431938 > Wahrheitswert <a cader —-1> nach FRC bringen
der Yariaklen
44797 > CHKCOM prueft auf Komma
Einsprung fuer BASIC-Rautine DIM
451835
451S6
45189
45192
451974
YARSUC ,
45195
45197
452908
45202
45204
45207
45210
45212
45215
45217
452193
45221
45224
43226
45229
45231
43232
45235
45237
45240
45242
45244
45246
435248
45250
45252
452534
45256
452593
TAX
JSR
I’SR
BNE
RTS3
LDxs
JSR
sT*
STR
JSR
JSR
BCS
JMP
LD*
ST“
ST“
ISR
BCC
JSR
BCC
TAs
ISR
BCC
JSR
BCS
CMP
BNE
LDR
STR
BNE
CMP
BNE
LDA
BNE
45202
121
45182
#0
121
12
693
121
45331
45215
44208
#0
13
14
115
45231
45331
43242
115
43232
45331
42232
#36
43232
#255
naechstes Zeichen
> Feld dimensicanieren (Name und Groesse werden als
M“ariskle gelesen und entsprechend dimensioniert)>
> CHRGOT holt letztes Zeichen
weitere Dimensionierung? Tas zurueck nach 43182
sucht Yariakle oder legt zie an
Flaqgwert fuer fehlende Dimensionierung
> CHRGQOT halt letztes Zeichen
Fla9 fuer DIM
Yariaklenname, erstes Zeichen
> CHRGOT holt letztes Zeichen
> prueft, ck Buchstake
Buchstabe? Ia: weitermachen
> "SYNTAX ERROR"
Stringa-Fla3 ruecksetzen
Integer-Fla93 ruecksetzen
> CHRGET halt naechstes Zeichen
Ziffer? Ja: weiter kei 45231
> erueft, ck Buchstabe
Buchstaßke? Nein: weiter kei 45242
zweites Zeichen des Yarisaklennnamens im *R merken
> CHRGET holt naechstes Zeichen
Ziffer? Jaı weitere Zeichen lesen
> prueft, ob Buchstabe
Buchstabe? Ja: weiter Zeichen lesen
Code fuer "$"?
Nein: weiter bei 45232
Str inga-rFla9 setzen
Unkedinater Sprung
Code fuer "="
Neins weiter kei 43275
Integer erlaukt ‘zum Beispiel als FOR-NEXT-Variakble)>?
Nein: "SYNTAX ERROR"
173
c--EBrt
>44 SHSIc W2Z - - - - - -
Yerwaltung der Yariaklen (Fortsetzung?
43268
45262
45254
45256
452688
453269
45271
45272
45275
43277
45278
45238
43282
45234
43257
432393
452321
43223
45295
43297
45299
45301
45303
45345
45307
43309
45311
45313
45315
453186
45318
45320
45321
43322
45324
45326
453283
45323
453331
45333
45335
45337
43338
453408
43341
45342
45343
45345
45347
45349
45351
45332
45354
45356
45358
45368
45362
LDA
STA
ORA
STR
TA
ORR
TAS
JSR
sT*
SEC
ORA
SEC
BNE
JMP
LDY
STY
LDRA
LD«
STK
STA
CP
BNE
CMP
BEQ
LDA
CMP
BNE
LORA
INY
CHP
BEQ
DE'Y
CLC
LDA
ADC
BCC
IN
BNE
CMP
BCC
SBC
SEC
SBC
RTS
PLA
PHRA
CMP
BNE
LOR
LDY
RTS
LDRA
LD'Y
CMP
BNE
CPY
BEQ
#128
14
59
69
115
ra
18
440
43287
43521
#0
16
45
46
965
95
43
43307
47
45341
59
95) ,T
43321
va
957,7
45445
35
#7
453297
45235
455
45340
#91
#165
Inteser-Flaa setzen
zur Kennzeichnung als Inteser-Yariable Bit 7 im ersten
und zweiten Zeichen des Yari=aklennamens setzen
Bit 7” im zweiten Zeichen des Yariakblennamens setzen
> CHRGET holt naechstes Zeichen
Yariaklenname (zweites Zeichen? abspeichern
Annahme von Feldvariakblen erlaukt?
Wenn nicht. damn Bit 7 setzen (“Accu kann nicht = 49 sein>
Code fuer "ii" sukbtrahieren
= &? Neins weiter hei 45287
> Bearbeitung von Feldvariaklen
16) ı= 9
Yariakblen-Anfangspointer
als Suchpointer speichern
Suchpainter = Feldwariaklen-Anfangspointer”
Nein: weiter kei 45747
Ja: weiter kei 45341
Yariaklennasme,. erstes Zeichen
mit Eintrag vergleichen
Ungleichs weitersuchen .„..
Yarisklenn=zme, zweites Zeichen
mit Eintrag vergleichen
Gleich: Yariakble „gefunden, weiter kei 45443
Suchzeiger
um 7 erhoehen “Laenge eines Yariakleneintrags>
lekertras addieren
als neuen Suchzeiger speichern. zurueck zum Anfang
Pruefung, ok Rccu einen Buchstakencade enthaelt
Henn ja, so ist die Carrv-Fla9 gesetzt,
ansonsten geloescht
Ruecksprungadresse lcauw der aufrufenden Routine
Rdresse low kei Rufruf van 4484
Nein: weiter kei 45352
Recu/ RI = 48915, Rdresse von Fliesskommazahl @
als Variaklenpointer fuer nichtdefinierte Variaklen
und Systenvariakle TI (Cuval. 43482 FF)
Yariakblennasme
erstes Zeichen des Namens = ”7T”?
Neins weiter kei 45371
Yariakle ’TI$’?
Jar weiter kei 45347
174
C Pr ©I4 PFEHSIcl zZ - - = - - - 45354
"erwaltung der Yariaklen (Fortsetzung?
453864 CPY 473 Yariakle ’T1I”?
45365 BNE 45371 Nein: weiter bei 45371
45368 IMP 44808 > "SYNTAX ERROR" <Zuweisung an TI nicht erlaubt)
45371 CMP #33 erstes Zeichen des Namens = "5"?
45373 BNE 435379 Nein: weiter bei 45379
45375 CP'Y 484 statusvariaskle ’ST’?
45377 BEQ 45368 Jas "SYNTAX ERROR" “Zuweisung an ST nicht erlaukt)
45379 LDA 47 Felcdvarisakblen-Anfangspointer
453931 LDY 48
45383 STA 935 Startadresse fuer Transfer (Quellkbereich)>
45385 STY 36
453837 LDRA 49 Yariaklen-Endpointer+1 “Quellbereich)
45389 LD'Y sa
45391 STA 9a Endadresse+1 fuer Transfer
45393 ST’r 91
45395 CLC Takelle der Arravs muss fuer Yariablenzuwei sung
45396 ADC #7 um siekern Bytes nach oken verschoben werden
45398 BCC 45401
454aA INY llekertrag addieren
45401 STA 38 Endadresse+1 fuer Zielbereich
45403 ST'Yr 89
45405 JSR 41912 > Black-Verschieke-Rautine
4548 LDA 38
45410 LDY 89
45412 IMY
45413 STR 47 Neuer Feldvarisklen Startpointer
45415 STY 48
45417 LDYV #0 Neue Yariakble einkauen
454193 LDA 83 Variaklenname und Yariablentyp
45421 5TA 957 ,Y als erste zwei Bytes in
45423 INY Yariakle aklegen
45424 LDA ra
45426 STAA 935) ,Y
45428 LDA 40 Rest des Yzrisklenwerts mit Nullen auffuellen
4543@a IN'Y
45431 STA 95) ,YT
45433 INY
454234 STA Im) .Yr
454365 IN'Y
45437 STA 99T) ,Y
45439 INY
45449 STA IT) ,YV
45442 INY
45443 STR 957 .Y
45445 LOA 95 Accu TR) zeigt auf erstes Byte des Yariakblenwerts
45447 CLC
45443 ADC #2 um zwei erhoehen
45458 LDY 9365
45452 BCC 4549455
45454 INY zeigt nun auf erstes Byte des Yarisklenwerts
45455 5TRA rı als YVariablenzeiger nach (71772) bringen
45457 STYr r2
45459 RTS
175
BEN 84 RRHSIc zZ - - - - - -
Laenge Arrav-header zu
454658 LOA
454862 ASL
45463 ADC
45485 ADC
45467 LDY
45469 BCC
45471 INY
45472 STA
45474 STY
45476 RTS
45477 144
45452 ISR
45435 LDA
45437 LDY
45439 RTS
45499 JISR
45493 JSR
45496 ISR
45499 LDRA
45501 BMI
FLPINT
45503 LDA
45595 CMP
45507 BCC
45503 LDR
45511 LDY
45513 JSR
45516 BNE
45518 JIMP
11
45593
198
101
115
44446
44429
102
45516
97
#144
45518
#165
#177
48219
45648
48283
95/96 > addieren, ergikt Zeiger auf erstes Feldelement
Anzahl der Dimensionen
»nerdaorpeiln (2 Bytes je Dimension?
plus fuenf BEurtes fuer Frrayheader
lekertr2a9 addieren
Ergeknis nach (393.39)
a Gleitkommadarstellung fuer -I327683
> FLPINT
> CHREGET holt naechstes Zeichen
> FRMEYL wertet Rusdruck auf, Ergeknis in FRC
> FRMNUM prueft. ck numerische Yariakle
VYorzeichenbvte var FRC
Bit 7 gesetzt? Ia: "ILLEGAL QUANTITY ERROR"
Expanmentbvte von FRAC
Exponent < 1867
Jas weiter kei 45518
Accu YR? = 45477, Startadresse fuer Kanstante -232758
> Vergleich zwischen FRC und Konstante
Ungleich? Jas "ILLEGAL QUANTITYT ERROR"
> Fliesskomma in Inteser-Format kringenr
Verwaltung von Feldvariablen
45521 LDA
45523 ORA
45325 PHR
45526 LDA
45523 PHRA
45523 LDY
45531 TYA
43532 PHR
45333 LDA
45535 PHR
453536 LDA
455383 PHR
45539 JSR
45542 PLA
45543 STA
45545 PLA
45546 STA
455483 PLA
45549 TAY
45559 TSx
45551 LDA
45554 PHR
45555 LDR
45558 PHR
12
14
123
0
ve
Flas4 fuer DIM
Integer-Filsa9 “Bit 7 sesetzt, falls Inteser>,
Fla943 fuer Strinarnumerisch auf Stsck retten
Zaehler fuer RArzahl Dimensionen,
VYariaklenname, zweites Zeichen,
Yarizaklenname, erstes Zeichen auf Stack retten
> Index-Auswertung “1&-Bit Integer lesen?
variaklenname, zweites Zeichen,
Yariaklennsme, erstes Zeichen,
Zaehler fuer Anzahl Dimensionen vom Stack holen
Yarisklenflass aus dem Stack kopieren
und wieder oben auf den Stack legen
176
+0
c-Er
4 BSrRsSslc W222 - - - - - -
+5552
Yerwaltung von Feldvariaklen (Fortsetzung)
453359
45561
45554
455686
45569
45570
45573
45375
45377
45379
453982
45333
45595
45536
45598
43594
45592
45594
43396
45599
45684
45602
455804
456846
45643
456518
45612
4561:3
45615
45617
45619
45621
45523
45624
45626
45627
456239
45630
45631
43633
45635
43637
45637
45648
45542
456453
45647
45649
45651
45654
45656
45658
45660
45682
45665
436568
LDA
STR
LOA
sta
INY
ISR
CMP
BEO
STYr
JSR
PLA
sSTA
PLA
STA
AND
STA
LD%S
LDA
ST*
STA
CMP
BNE
CP*%
BEO
LOW
LDA
IN'Y
CMP
BNE
LDR
CMP
BEQ
IN'Y
LDR
CLC
ROC
TAs
INY
LDA
ADC
BCC
LD%
BIT
LD*S
JMP
108
253,8
101
257,8
121
#44
43531
11
447231
13
14
#127
12
47
49
95
96
50
4565083
49
436655
4a
95) ,Y
59
45623
va
95) ,.Y
45645
957 ,Y
95
95) ,Y
45637
43802
45460
41992
Indexbyrtes an Stelle der Yariaklenflays
auf den Stack legen
Dimensionszaehler erhoehen
> CHRGOT halt letztes Zeichen
Komma <weiterer Index>?7
Jar zurueck nach 45531
Anzahl der Dimensionen merken
> prueft, ob ")" folst
Flza9g4 fuer String/numerisch,
Fla4 fuer Integer wiederherstellen
Feldoar iaklen-RARnfansaspcointer
als Suchpocinter initisalisieren
Ende der Feldvariaklen erreicht?
Nein: weitersuchen ...
Jas Yariakle nicht gefunden, weiter bei 45665
Yarisklenname auf RArraxrheader
mit gesuchtem Yariaklennamen vergleichen
Ungleich:s weiter kei 45623
zweites Zeichen des gesuchten Yariskblennamens
mit Feldvariasklenname vergleichen
Gleich: Feld gefunden, weiter bei 45643
sonst Feldlaenge zum Suchzeiger addieren,
ergibt Pointer auf naechstes Array
Code fuer "BRD SUBSCRIPT"
Code fuer "ILLEGAL QUANTITY"
> Fehlermeldung, READY.
Code fuer "REDIM’D RERRAY"
DIM-Flag = 8 <VYariakle gefunden?”
Nein: "REDIM’OD ARRAY ERROR"
> 83/839 als Pointer auf erste Felduvariakble
Dimensionszaehler
mit Rnzahl an Dimensionen im Arravheader veraleichen
Ungleichs "BRAD SLIBSCRIPT ERROR"
> Suche nach richtigem Element des RArravs
> Laenge des Yarisklenkopfs zum Suchzeiger addieren
> prueft, ob genug Platz im Speicher
177
CP rn 54 ERHZSIC „ZZ - - - - - -
4 1
Verwaltung der Feldwariablen “Fartsetzung)
45671
45673
45673
45577
4365723
45651
456933
45594
456353
45687
45639
45591
43692
45693
45695
45697
45698
45699
43708
45702
45704
45706
45708
45714
45711
4a712
45714
45715
45716
45718
45719
4S721
4S722
45723
43725
45728
45730
45732
45734
45736
43738
45748
43742
45744
45745
45746
457483
457508
45751
45753
45756
45758
45768
453762
45764
45766
43768
457693
45771
45773
45773
LO
STYr
LO
LDRA
STR
BPL
DE*
IM'Y
LDA
STR
BPL
DES
DE“
sT«
LDA
IN'Y
INY
IN'Y
STR
LD*S
LDA
BIT
BYC
PLA
CLC
RDC
TAX
PLA
ADC
INY
STR
INY
TAR
sta
JSR
ST
STR
LD'Y
DEC
BNE
ADC
BCS
sta
TA’
TARA
ADC
BCC
IN'Y
BEQ
JSR
STR
ST'Yr
LDA
INC
LDY
BEQ
DEY
sta
BNE
DEC
DEC
Ta)
114
#5
69
953 ,T
45684
ra
953 ,Y
456593
95) ,Y
#11
#08
12
45718
#i
#9
a5) ,Yr
95>,Y
45908
Lszerge eines Elements im Array hei Real
Yarizklernsme. erstes Zeichen
in Arr=yvhesder kringen
Integer? Nein: weiter hei 436834
kei Integer Anzahl Eytes je Element vermindern
Variaklenname, zweites Zeichen
in Arrauheader bringer
Fliezskomma?” Jar weiter 45693
sonst Anzahl Buetes je Element um zwei vermindern
ElemerntizengetFLP: 5, Strinrs: 3, Integer: 2)
Anzahl der Dimensionen
in Arrzwheader bringen
#RRccu)> := il, Ersatzwert bei fehlendem DIM
Aufruf durch "DIM”?
Nein: weiter kei 45718
Vierte der Dimensionierung „om Stack halen
um eins erhoehen “Feld mit Index 8>
llekertr 39 =dddieren
DIM-WMert in Arrayheader bringen
> kencetigten Speicherplatz fuer Dimensionen? kerechnen
Speicherkedarf Ic
Speicherkedarf hiah
Zeiger auf Arrawheader
weitere Dimensianen?
Jar zurueck zum Schleifenkeginr
Laengae des Feldes zur Anfangsadresse addieren
185-Bit-Uekerlzauf? Ja: "OUT OF MEMORY ERROR"
Accu’ VYR? := Endadresse des Feldes
186-Bit-Uekerlisuf? Ja: "OUT OF MEMORY ERROR"
> prueft, ob Jgenuga Speicherplatz
neuen Endezeiger fuer Yariaklen setzen
Alle Elemente des Feldes mit Nullen vorkesetzen
178
c-Br
>44 PHSICc WW - - - - - -
u de er re
rferwaltung der Feldvariaklen <Fortsetzung?
43777
45779
45781
45782
35794
45786
45788
45798
45792
45793
35795
45/97
43799
45501
45302
45304
45306
45308
51a
45912
45913
45814
459815
45817
45818
4592a
45322
45324
45326
45827
45328
45830
45832
45335
35338
45839
45941
45343
45344
4593958
45847
45350
459352
45853
45354
45355
45858
45360
453862
458654
459366
453553
4597a
45972
45873
45875
45977
45878
45373
BNE
INC
SEC
LODA
SBC
LOD'Y
sTA
LOA
INY
SBC
STR
LDA
BNE
INY
LODR
sSTA
LOR
STR
STA
INY
PLA
TAS
STA
PLA
STR
CHP
BCE
BNE
INY
TARA
CMP
BCC
J’MP
IMP
INY
LDRA
ORA
CLT
BEQ
ISR
TARA
ADC
TRAx
TFA
LO
ADC
sT“
DEC
BNE
sta
LDs
LDA
BPL
DE<
LOR
BPL
DEN
DEX
stk
45768
9
49
95
#2
95)
5a
10a
ıe1
95)
45338
45932
95)
43339
45637
114
‚Yv
-Y
‚r
Endezeiser des Feldes minus
Zeiger auf Arrayheader eraibt Laerse des Feldes
in dritte und vierte Position des Arrsvrheaders
schreiben
Rufruf durch
Jaı RTS
ansonsten Feldelement suchen
Anzahl an Dimensionen
"DIM”"-Befehl?
Feldindex vom Stack halen
nach (109.101) kringen
mit durch "DIM” gesetzten Grenzen veraleichern
Kleiner?” Ja: weiter kei 43938
sonst: "BRD SUBSCRIPT ERROR"
ekenso im Falle von Gleichheit der Bytes high die
Brtes law ueberpruefen
kleiner? Ta: weiter kei
> "BAD SUBSCRIPT ERROR"
+3839
> "QUT OF MEMORY ERROR"
Berechnung der Position eines Feldelements
innerhalb eines Arr aus
> KAReTR> = 113/11 ECCITFIE) „Y?
Zeiger in Arrzuhesader
Zaehler fuer Rnzahl Dimensionen vermindern
Laenge einer Elements (Real-RArra»>
Bit 7” im ersten Zeichen des Namens gesetzt (Integer)?
Neins weiter kei 43873
Elementliaenge vermindern
Bit 7” im zweiten Zeichen des Namens gesetzt (FLP?>?
Jas weiter hei 453379
Laensge eines Feldelements
179
Er
>44 FSH5Ic Vz u - - - - - + T2Z1
Yerwaltung der Yariaklen “Fortsetzung?
45381 LDA
435333 ITSR
45836 TAA
45387 ADC
4533393 STA
458591 TYA
458922 ARD
455394 STA
433986 TAY
453337 LDA
45339 RTS
#40
43909
83
De
89
v2
vi
> Berechnung des Offsetzs des Feldelements
zur Rodresse des ersten Feldelements addieren
ergikt Paesitican des gesuchten Elements
Adresse in Yariaklerpcointer ı(T1rr72) und CAccu"rR> bringen
18-Bit-Binsermultiplikaticon von <4a.“41) mit (1137/1145). Ersebris nach “KRrrR>
459009 ST'Yr
45902 LDRA
45904 STA
459965 DEY
459907 LDR
45949 STA
45911 LDA
45913 5TR
45915 LOX
45317 LOD'Y
45919 TXA
45920 ASL
45921 TAX
45922 TyYA
45923 ROL
45924 TAY
45925 BCS
45927 ASL
453923 ROL
45331 BCC
45933 CLC
45934 TSA
45935 ADC
453937 TA
45938 TYA
45939 ADC
45941 TA'Y
45942 BCS
45944 DEC
45946 BNE
45948 RTS
BASIC-Funktion FRE
45349 LDR
45951 BEQ
45953 JISR
45956 JSR
45959 SEC
45968 LDA
45962 SBC
45964 TRY
45965 LDR
45967 SBC
34
952 ,Y
49
95) .Yr
41
#16
23
#0
#0
45335
113
114
45944
40
41
43333
93
45919
13
45955
46758
46374
S1
43
52
58
YR merken
.4ar41) := KIT), TV)
Bit-Verschiekezaehler
Eyvtes lIcu und high des Erseknisregisters (CARTR>
mit Null vorbesetzen
<XReYR> fuer naechsten Schritt der
Binsermultiplikation verdoppeln
VUebkerliauf in Bit 16?
Jas "OUT OF MEMORY ERROR"
naechstes Bit aus «“1137/114) herausshitften
Carry = 0? Izas Addition ueberwehenr:
SRTYR> = KKRTR> + Karat)
VUekerlauf bei ARddition? Ias "GUT OF MEMORY ERROR"
naechstes Bit herausshiften
alle 16 Bits verschoben? Nein: weitermachen ...
str ing-Flag gesetzt?
Nein: weiter kei 45956
> FRESTR
> GARBARGE COLLECT
Yom Str ing-Anfenraspcinter den
Yariaklen-Endezeiger suktrahieren,
daraus eraikt sich der freie Speicherplatz
180
cEM S4+4 EAS>SIC W222 - - - - - - 452352
INFLP3: Umaandlung einer 16-Bit-Inteser-Zahl mit Yorzeichen in Gleitkomma
45969 LDS
45971 ST
45973 STR
45975 STYr
453977 LD%
45973 IMP
BASIC-Funktion POS
453782 SEC
459333 JSR
45786 LOA
45988 BEQ
Test auf Direktmadus
45999 LD*E
45992 IN“
45973 BNE
45995 LDS
45997 BIT
45998 LD“
4600aB JIMP
BRSIC-Rautine DEF
46003 ISR
46006 ISR
48209 JISR
46812 LDR
46014 STA
465016 JSR
4620193 JISR
46022 JSR
46925 LOA
465927 JISR
48030 PHR
46931 LOR
48033 PHRA
45034 LOR
48036 PHR
46937 LDA
460339 PHA
4680849 LDRA
468042 PHR
46043 TSR
4sa4E JMP
468043 LOA
45051 JSR
465054 ORA
4e0aS6 STA
46953 JISR
45061 STA
46063 ST'r
4650855 JMP
#0
13
38
393
#144
43196
63328
40
43969
58
45399
#21
#27
42037
465043
45798
44794
#128
16
45195
444293
44791
#178
44799
122
43256
46159
#165
44723
#128
1&
45202
‚8
‚9
44429
Flags fuer String loeschen
Inteser in (YR’Accu> nach (99799) bringen
Expcanent := 15 (144 — 128)
> Fliesskommaszahl in FAC erzeugen
Flaqwert fuer "Cursorpasiticn lesen”
> PLOT, Cursaorpcosition lesen, Spalte ins YR
Erte hiyh lceschen
Unkedinster Sprung nach INTFLP
"ILLEGAL DIRECT ERROR">
Zeilennummer hiah (CIm Direktmodus = 255)
Direktmoadus”?” Nein: RTS
Code fuer "ILLEGAL DIRECT"
Code fuer "UNDEF”’OE FUNCTION"
> Fehlermeldung, READY.
FN-Namen pruefen, FN-Peinter setzer €798.”Y9)
prueft auf Direktmodus
rrueft, ob "«" folgt
VID
Anrnahme von Inteser- und Feldvarisklen sperren
> YARSUC sucht Variable oder legt sie an
> FRANUM prueft, ok numerische Variakle
> prueft, ob ">" folgt
BASIC-Code fuer "="
> STNCHR prueft, ob dieser Code folgt
erstes Zeichen des Rusdrucks auf Stack legen Sunwichtig)
ebenso den Pointer auf die FN-Yariskble
CHRGET-Pointer (zeigt auf FN-Rusdruck?>
auf Stack legen
> DATA, setzt CHRGET-Pointer auf naechstes Trennzeichen
> Bytes vom Stack in FN-Namensvariakle bringen
BRSIC-Code fuer ’FN”
> SYTHCHR prueft, ob dieser Code folst
Rnnahme von Integer- und Feldvariaklen sperren
> YARSUC sucht Yariable oder leat sie an
FN-Pcinter zuf YVariskle setzen
> FRMNUM prueft, ob numerische Variable
181
CBrI &©4 PBR=SIC Vz - - - - - - ISA
BASIC-Funktion FN
3sRsg8 ISR 4565049 > FN-Namen pruefen, FN-Pointer setzen (7379)
46871 LDA 79 Pointer fuer FN-Namen auf Stack legen
469373 PHRA
468874 LDA Rg-
gea7E& PHA
48077 JSR 447893 > Klammern pruefen. Rusdruck in Klammern auswerten
46508308 JSR 44429 > FRMNUM prueft, ob numerischer Ausdruck
4883 FLA
45034 STA v8
4ERS6 FLA
3eEas? STA v9
480873 LDY #2
48091 LDA 78) ,Y Zeiger low auf FN-Variable
46493 STA ri
468095 TAX
45495 INY
468097 LDA 78),Y Zeiger high auf FN-Yariskble = @ (FN-Yariakle wurde erst
465099 BER 45998 durch FN-ARufruf angelegt? Ja: "UNDEF”D FUNCTION ERROR"
sg8101 STA ?’2
45103 INY
46104 LOR c7/1>D,Y Mert der FN-Yariablen auf Stack retten
4Es10&6 PHR
46107 DEY
46108 BPL 46104
46110 LDY v2
465112 JSR 4q48asS4 > FRC runden und in FN-Variakle kringen
46115 LDA 123 CHRGET-Pointer zuf Stack retten
46117 PHR
46118 LDRA 122
4612A PHA
48121 LDA .7S),Y CHRGET-Pointer auf Funktionsausdruck setzer
46123 STA i22
46125 INY
4612686 LDA 757 ,Y
46128 STRA 123
48138 LDA ?’2 Pointer auf FN-VYariakle auf Stack retten
46132 PHRA
46133 LORA rı
46135 PHA
46136 JSR 44426 > FRMEYL, FRMNUM, numerischen Rusdruck auswerten
46139 PLA Pointer auf FN-Yariakle nach (73.79)
45148 STR 8
46142 PLA
46143 STA ‚9
46145 JSR 121 > CHRGOT holt letztes Zeichen
45148 BEQ 461533 Trennzeichen? Ja: weiter kei 45153
468150 IMP 44808 > "SYNTAX ERROR"
Abschluss der FN-Auswertung
461353 PLA CHRGET-Pointer wiederherstellen
46154 STA 122
461356 PLA
46157 STA 123
46159 LDY #0 alten Wert der FN-Yariaklen wiederherstellen
4siel PLA
46162 STA (78) ,Y
46164 PLA
451635 INY
4E166 STA 73) ,Y
4E168 PLA
182
cPHMI 54 FErHMSIc zZ - - - - - -
4152
BASIC-Funktion FN <Fortsetzung?
46169
46170
46172
46173
46174
46176
46177
46178
46180
INY
sta
PLA
INY
STA
PLA
IN’
STR
RTS
73) ,Y
75) ,T
79) .,Y
BASIC-Funktion STR$
46181
46194
45186
46139
451970
45191
45173
46195
Speicherplatz pruefen,
46197
45199
48201
46203
46205
48208
46210
46212
4s21d4
JSR
LD'Yr
ISR
PLA
PLA
LOA
LD'Y
BEQ
LD«
LDY
ST*
ST'r
JSR
ST»
sTYr
sTA
RTS
44429
#0
486097
String lesen und
45215
468217
46219
4s221
46223
462253
46227
465229
4s231
46232
46234
45236
46232
468240
48242
46244
46246
46248
46249
46251
46252
46254
46256
46.2533
46260
46261
LDX
STK
STK
STA
STY
STA
STY
LDY
INY
LDA
BER
CMP
BEQ
CMP
BNE
CMP
BEQ
CLC
STY
TYA
ADC
STA
LOX
BCC
INK
STK
> FRMHNUM prueft, ob numerische Yariskle
> FACSTR erzeugt String aus FRC ab (2557
Ruecksprungadresse in Funktionsauswer tung
vom Stack entfernen
<Accu/tR) :ı= 255. Startadresse des Strings
Unkedinater Sprung
Stringpointer setzen
-10a7’101)
zeiat auf Stringdescriptor
> Speicherplatz pruefen, String-Anfangspointer setzen
Startadresse des Strings nach 798799)
Laerge nach (97)
in Strirgbkereich transferieren
#34 Code fuer Anfuehrungszeichen nach <7> und (8)
r4
3
111 Startadresse des Strings nach «1117112> und 98799)
112
93
393
#253 Pointer auf String initialisieren
<111>,Y Endezeichen?
46248 Ja: weiter bei 45248
v
462744
8
45231
#34
45249
97 Strinralaenge
111 zur Anfanasadresse des Strings addieren
113 ergibt Endadresse+1 des Strings
112 Vebkertra93 addieren
46261
i14
183
CP 54 BrS>SIcl zZ - - -
String lesen und in Stringbereich transferieren
Fortsetzung?
48263 LDA 112 Start=zdresse high
465265 BEQ 46271 = a? Ja: weiter bei Jde2Y’1
4es267 CMP #2 = 2? j
46269 BNE 45232 Nein: weiter kei 45232
45271 TYA Str inglaenge
4s272 JSR 46197 > Speicherplatz pruefen, Stringpointer setzen
46275 LDXS ı111i Anfangsadresse des Strings in (111/112)
46277 LDY 112
46279 ISR 46728 > Strina in cberen Stringbereich transferieren
45232 LOX 2 Descrirtor-Index fuer Tsbelle “2I-...,.33)9
46284 CPX #34 Tabelle voll?
462386 BNE 45293 Nein: weiter bei 46293
468298 LDX #25 Code fuer "FORMULAR TOO COMPLE«"
46230 JMP 42039 > Fehlermeldung, READY.
45293 LOA 97 Stringdescriptor “Laerge; Startacdresse lau, Kiah>)
462935 STAA a.r% in Descriertortakelle bringen
46297 LDA 938
46299 5TA 1,3%
46301 LDA 393
46363 STA 2,8
468305 LDY #0 CHR/TYR> := Pcinter auf Descrietor in Tabelle (25,...,23)
468347 STA aa c1aB’101) := CKR/TR) (CPceinter auf Descriptor)
465309 STY 101
46311 STY 112 112) ı= QA
46313 DEY
468314 STY 123 strinaflay setzen
46316 STR e3 Zeiger auf letzten Descrirtor setzen
45318 IN“
46313 INS
46320 INX
46321 STx 22 Descrietor-Index um drei erhcaehen
46.323 RTS
48324 LSR 15 Fla943 fuer Garkage Collect ruecksetzen
46326 PHA Stringlaenge retten
46327 EOR #255 Str ing-Anfangspointer (351.32)
45329 SEC um Stringalaenge vermindern
4683308 ADC 51
46332 LDY 52
46334 BCS 46337
46336 DE'Y
46337 CPY sa Ist Str ing-Anfangzeiger kleiner als Zeiger
46339 BCC 45359 auf Ende der Yariablentskelle? Ja: weiter bei 48358
46341 BNE 46347
46343 CMP 49
46345 BCC 46358
46347 STAR 51 Zeiger als neuen Stringanfanaspointer setzen
465349 STY 52
46351 STR 53
46353 5TYr 54
46355 TAX
463356 PLA stringlaenge wieder vom Stack haler
46357 RTS
46355 LDX #16 Code fuer "OUT OF MEMORY"
463689 LDRA 15 Garbage Collect kereits ausgefuehrt?
46362 BMI 46290 Jas "OUT OF MEMORY ERROR"
46364 JISR 46374 > GARBRAGE COLLECT
46367 LDA #128
46369 STR 15 Flaus fuer Garkage Collect setzen
46371 PLA Stringlaenge wieder vom Stack holen
46372 BNE 465326 Nochmals Einkau des Strings wersuchenr
184
ce SI4 BHSIcl w'Z - - - - - =
GARBAGE COLLECT,
46374
46376
46378
46338
46382
463934
46336
46383
46390
46392
46394
46396
463385
46400
46402
454094
46406
468403
asdı]
46413
46415
46417
46419
46421
46423
46425
46427
464 .2
46.31
46433
46436
46438
46448
46442
46444
46446
464483
46450
46452
46454
46456
46458
4ög461
46453
45455
46467
46469
46470
45471
46473
45474
46475
46477
45479
46451
45432
464534
46456
LOS
LDRA
ST*
STRA
LOY
sTYv
STYr
LODA
LD*
STA
ST*
LDA
LD*S
st“
ST
HP
BED
JSR
BEQ
LOA
STA
LOA
LOX
STR
sT*
CPX
BNE
CHP
BEQ
JSR
BEQ
STR
sT«
LOR
STA
LDA
LD«s
CP“
BNE
CHMP
BNE
JMP
STA
sT*
LD'Y
LOR
TA»s
IN'Y
LDA
PHP
IN'Y
LDA
ADE
STA
INY
LDA
ADC
sTtA
59
565
51
52
4a
46413
46535
46404
#7
83
45
46
34
35
48
46433
47
46438
46323
46425
34)
34)
34)
85
‚Vv
‚v
‚Y
45.2374
Stringmuellkeseitigung
Pointer auf Ende Arbeitsspeicher
als Str ing-Anfangspeinter setzen
variabklen-Endepainter
nach 9597985) bringen
Startadresse der Descriptarentskelle (25,...,33>
als Suchpointer nach <34.35> kringen
identisch mit Pointer auf letzten String
Jas weiter kei 46413
> Position des String feststellen,
Unbedinater Sprung
494. Pointer setzen
Schrittueite fuer Suche in Yariskblentakbelle
Pointer auf Yariaklentakelle
als Suchpointer nach 134.35) bringen
Ende der Yariaklentabkelle erreicht?
Nein:s weiter kei 46433
sanst zu Arraxw-Behandlung uebergehen
> Position des Strings feststellen, 99f.
Unkedinater Sprung
Pointer setzen
Pointer in Arrauwtsbelle
Schrittweite fuer Suche innnerhalbk eines Arrays
Ende der Arrazwtakbkelle erreicht”?
Nein: weiter kei 4461
> sonst Transfer
Pointer auf Arraw, header
Yarisklenname, erstes Zeichen
in XR vebertrasen
Yariablenname, zweites Zeichen
Statusflags merken
Laenge des Arrays zu Pointer auf Arraytakelle sddieren
185
cEn ©&©4 BASIC vw - - - - - -
GARBAGE COLLECT Fortsetzung?
46488
46489
46491
46492
46494
46495
46497
46499
465908
46502
46504
45306
46505
46510
45512
46514
465516
46518
46520
46523
46525
46527
46529
46330
46532
46534
465335
46537
463393
46344
46542
46543
46544
46546
46543
46558
46552
46554
46556
46558
46568
46562
46564
46566
46568
46570
46572
46574
46576
46578
46588
46582
46584
46585
46587
46589
46591
46593
46595
46597
PLP
BPL
TARA
BMI
IN'Y
LDA
LD'Y
ASL
ADC
RDC
STR
BCC
INC
LD%*
CP®
BNE
CMP
BEQ
JSR
BEQ
LDA
BMI
INY
LDR
BPL
INY
LDR
BEQO
IN’
LDR
TRAS
INY
LDR
CMP
BCC
BNE
CPx
BCS
CMP
BCC
BNE
CP*
BCC
sts
STR
LDA
LDS
sTR
STx
LOR
STA
LDR
cLC
RDC
sTA
BCC
INC
LD*
LD'Y
RTS
46446
46446
345 ,YV
465832
34) ,Y
46532
34) ,'Y
46532
34
34
46593
35
35
#8
Stringvariakle? Nein: weitersuchen ...
String,sariskle?” Neins weitersuchen ...
Anzahl Dimensionen
mal 2 «zwei Ryrte je Dimensian)
plus 5 “Arraxsheader>
zum Pcinter addieren
Pcinter in Array,
mit Pointer auf naechstes Feld vergleichen
Ungleich? Ja: weiter hei 46524
Feld
9947. Pointer
Gleich?” Jas weiter mit naechstem
> Position des Strings feststellen,
UInkedingter Sprung
Yariaklenname, erstes Zeichen
Integer kzw. Function?” Jar weiter 45532
Yarisklenname, zweites Zeichen
eic.
Real? Ja: weiter bei 46532
Stringlaenge
= 8? Ja: weiter kei 46532
Startadresse des Strings nach “ER’Rccu)
mit <S1.52)>
Str ingpointer neraleichenr
Groesser”?” Ja: weiter kei 46582
Stringspointer mit 9536) veraleichen
Kleiner? Jas weiter hei 465332
Startadresse des Strings nach (9595) kringen
Adresse des Stringadescriptors
nach (78/79) kringen
Schrittweite fuer Suche in Yariaklentabelle
zum Suchpointer addieren
und wieder nach (34.735> bringen
Accu/XR) ı= (34,35)
fuer unbkedingten Sprung
186
setzen
cEr1
GARBAGE COLLECT CFortsetzung?
465398
46608
456802
466094
48.608
468083
45603
46610
48612
46614
46516
46618
46620
46622
46624
46625
466283
46630
46632
466.39
46637
46633
46640
46642
46643
46645
46647
468548
46650
LOR
ORRA
BEO
SS erSlIc VvZ Mm = u AR re u 13.595
Strirg zwischen Yarisaklentakellenende
und oakerem RANM-Ernde sefunden?
Nein: fertig, RTS
Falls Suchlauf in Arrav-Suchlauf, sa ist (357 = 3,
oA
AND
LSR
TAY
STA
LOR
RDC
sta
LOR
ADC
STA
LDRA
LOS
STAÄ
ST*
ISR
LDY
INY
LDA
STA
TAs
INC
LDA
IN'Y
STR
JMP
7S;
46373
sonst ist (89) = 7
Y’R ist Z bei Einzelvariakble, &ü bei Array
Laenge des Strings
zur Anfzargsadresse low des Strinas addieren
ersikt Endadresse+1 low des Strings
ekensoa Endadresse+1 hiah berechnen
Endadresse des Zielkereichs fuer Transfer
> Black-Verschieke-Rautine
»
neue Anfangsadresse low
in Descriptor bringen
neue Anfanssadresse hiah
in Descriptor bringen
> weitermachen, bis alle Strings kearkeitet wurden
BARSIC-Routine zur Str-ingverknuepfunga (+)
46653
46639
4668365
48638
46639
46662
46565
466686
46688
46669
46671
46673
46675
4656876
46678
46630
46682
46685
46638
46691
46693
46695
46698
46’01
46703
46705
46708
46711
LDRA
PHR
LODA
PHA
I’SR
JISR
PLA
STR
PLA
sSTA
LO
LOA
CLC
ADC
BCC
LDS
JMP
JSR
JSR
LDR
LDY
JSR
JSR
LDA
LO'Y
JSR
JSR
JMP
101
198
44675
44431
111
112
#0
111
100
46685
#23
42939
45197
465714
ga
Si
46782
46732
111
112
46762
46282
44472
>.,Y
I,YV
Pointer auf Descriptor des ersten Strings
auf dem Stack zwischenspeichern
> Adresse des zweiten Stringdescriptors nach <18a/’1091>
> FRHMNUM prueft, ck Strinwwariakble
Pointer auf Descrieptor des ersten Strings
wiederherstellen
Lsaense des ersten Strings
plus Laenge des zweiten Strings
Kleiner als. 256? Jar weiter kei 46685
Code fuer "STRING TOO LONG"
> Fehlermeldung, READY.
> Speicher pruefen, Platz fuer Gesamtstring reservieren
> ersten String in reser»ierten Bereich kringen
Peinter auf Descriptor.des. zweiten Strings
kwird bei Rufruf von 46197 ,mach (S8’8T>7 gebracht)
> FRESTR
> zweiten String an ersten
Fointer auf Descrietor des
String anhaengen
ersten Strings
> FRESTR
> Descriptor in Tabelle nach (25,...,33)
> zurueck in Ruswertung von Ausdruecken
187
CB S5:S+ BRSIC WZ - - - - - = 4,14
BASIC-Routine zur Str ingverknuepfung C+)
4s7/id4 LOY #0 Ei
457/16 LOR ce1l11>.,Y Stringalaenge auf Stack retten
46713 PHRA
46719 INY
46720 LDRA <iti11>,Y ARnfanssadresse lou des Strings ins XR
4E722 TAS
468723 INY
48724 LOA el1l1l>.Y Anfznasadresse high des Strings ins TR
4öY26 TAY
46727 PLA Strinalaenge wieder holen
48728 STX 34 Adresse lau ö
46730 STY 33 Adresse hiah
46732 TAT Laenge = 8?
46733 BEQ 46745 Ja: weiter kei 46795
46735 PHRA
46736 DEY
46737 LDA 3493 ,Y7 string in Bereich, zuf den «33.7945 zeiat uekertragen
45739 STA 337 ,Y
46741 TA
46742 BNE 467365
46744 PLA Str inglaenge
46745 CLC Pointer (537545 um Strinalaenge erhoehen
468746 ADC 53
45743 STR 53
468750 BCC 2 4gEräd
46752 INC 54
46754 RTS
FRESTRıs Str ingverwaltungsroutine
46755 JSR 44431 > FRMNUM erueft, ok Stringvariable
46758 LDA 1090 <1AaB87/101) zeiat auf Stringdescriptor
46760 LDY 101
46762 STA . 34 nach <34.’35) kringen
46764 STY 35
468766 JISR d6Esıl > prueft,. ok identisch mit letztem String
45769 PHP Statusflass merken
4sYYva LDY #0
46772 LDA 34) ,YV strinalaenge auf Stack retten
46774 PHA
46773 INY
468776 LDA 34) ,Y Rnfangsadresse low des String ins KR
46778 TAX
46779 INY
46730 LDRA 34) ,Y Anfangsadresse hiah des Strings ins YR
46782 TAY
46783 PLA stringlaenge wieder halen
46794 PLP neuer String identisch mit altem String?
46785 BNE 46396 Nein: Anfangsadresse des Strings nach (34735), RTS
46787 CPY s2 neue Stringadresse mit identisch mit Pointer auf
46789 BNE 46906 unteres Stringende? Nein: weiter bei 4J6306
46791 CPX : 51
46793 BNE 46806
46795 PHR str ing-Anfanaspointer um Laense des Strings
46796 CLC hinaufsetzen
46797 ADC 51
46799 STR 51
469301 BCC 46805
46803 INC 32
188
cBr
FRESTR: Str inaverwalitungsroutine “Fortsetzung?
45805 PLR
46306 STX
465308 ST'r
4631a RTS
463811 CP'Y
45813 BNE
45815 CMP
46817 BNE
46519 STA
46821 SBC
46323 STR
46325 LD'Y
45827 RTS
34
35
24
46827
3
4&327
22
#3
23
#0
BASIC-Funktion CHR$
46523 ISR
46331 TAR
48332 PHR
46333 LDR
46835 JSR
4638398 PLA
46837 LDY
46841 STA
46343 PLA
469844 PLA
48345 IMP
BASIC-Funkticon LEFT$
45343 JISR
46351 CMP
46353 TYA
459354 BCC
46356 LDA
4593598 TA»
45357 TYR
46360 PHRA
45961 TAR
45362 PHA
455653 JSR
482388 LDA
468368 LOW
46370 ISR
45373 PLR'
46874 TAT
463753 PLA
48876 CLC
46877 ADC
468379 STA
46881 BCC
463833 INC
46355 TYA
465336 ISR
465339 JMP
47a093
45203
30
siı
46762
34
24
45385
35
4E732
dgazs2
5: Pernrsiıcl W222 z en “ = = = +45 53095
Stringlaenge
Startsdresse low
Startadresse hiah
neuer Pceinter zauf Stringdescriptor in (Accu/YR>
identisch mit <23724>? Nein: RTS
neuen Pointer nach (227,
c23> um drei vermindern “Carry ist bereits 1)
> GETBYT holt folgenden Wert ins *R
Brte merken
Stringalaenge auf 1 setzen
> Speicher pruefen. Platz reservieren
Brte als Element des Strings speichern
Ruecksprungadresse aus Stack entfernen
> Stringdescrirtor in Tabelle (2S,...,33> kringen
> Stringadreszse und Parameter vom Stack halen
Parameter fuer LEFT$ mit Stringalaenge vergleichen
Accu) ı= 0
Parameter kleiner Stringlaenge? Iaı weiter kei 46960
Stringlaenge ins XR
Accu) = A
Position des ersten Elements des neuen Strings
Strinalaengse kzuw. Parameter fuer LEFT$
> Speicher pruefen, Platz reservieren
ga/’gs1> ist Pointer auf Stringdescriptor
> FRESTR
Laense des neuen Strinas -
Position des neuen Elements “kei LEFT$ = 8)
Adresse des alten Strings entsprechend erhoehen
Laenge des neuen Strings
> neuen String in Strirgkereich vebkertrasen
> Stringdescriptor in Tabelle (25,....,33 bringen
189
CB S4 BASIC w2zZ - - - = - -
BRSIC-Funktion RIGHTF$
46392 ISR 46945
45395 CLC
46895 SBC 30) „'Yr
46898 EOR #255
4saaa IMP 46854
BRSIC-Funktion MID$
46993 LOA #255
46985 STR 121
465947 ISR 121
45910 CMP #41
46912 BEQ 46920
46914 JSR 44737
46917 JSR 47008
46920 JSR 46945
465923 BEQ 47aga
46925 DES
46925 TAA
46927 FHR
46928 CLC
469293 LDX #0
46931 SBC 80) ,Y
46933 BCS 468561
465935 EOR #255
46937 CMP ıi01
46933 BCC 46862
46941 LDA 181
465943 BCS 46962
45945 JSR 44791
46948 PLA
46949 TAY
469598 PLA
46951 STA 83
46953 PLA
45954 PLA
46955 PLA
46956 TAX
46957 PLA
46958 STR sa
4696A PLA
46961 STA 1
46963 LDA 35
46365 PHR
469365 TYA
46967 PHR
46968 LDY #0
46978 TXA
46971 RTS
BASIC-Funktion LEN
46972 JSR 46978
46975 JMP 45986
46978 JISR 46755
46981 LDX #0
46983 STX 13
469385 TAY
468986 RTS
4.92
> Stringadresse und Parameter halen
zweiten Parameter von Stringlaenge sukbtrahieren
(umgekehrt durch Vorzeichenumkehr)>
Accu enthaelt Nummer des ersten Elements
> weiter wie kei LEFT#$
Ersatzwert fuer zweiten Zshlenparsmeter
> CHRGOGOT holt letztes Zeichen
Code fuer ">"?
Jar kein zweiter Parameter. weiter bei 46924
> CHKCOM prueft, cb Komma folgt
> GETBYT bringst zweiten Parameter nach “1a1l>
> Stringadresse und zweiten Parameter holen
erster Parameter = a? Jar "ILLEGRL QUANTITY ERROR"
Positian des ersten Elementz inmerhalk
des alten Strings zuf den Stack aklegen
Laenge des alten Strinas kleiner als erster Parameter”?
Ja: restliche Ausfuehruna bei LEFT#
neue Stringlaenge berechnen
kleiner als zweiter Parameter?
Jas restliche Ausfuehrung bei LEFT$
sanst zweiten Parameter als rechte”
Inbedingter Sprung
Str ingkegrenzund
> prueft, ck ">" folgt
Ruecksprungadresse low,
Ruecksprungadresse hish der aufrufenden Routine
low,
hiah
Ruecksprungadresse
Ruecksprungadresse non JSR 84 «45a24)
erster Parameter .
Rdresse des Stringdescriptors aus Stack
nach (80.'931> bringen
Ruecksprungadresse der aufrufenden Rautine
wieder auf den Stack lesen
Index <Imdirect-Adressierung? := 8
erster Parsmeter
> FRESTR, String-Flas loeschen
> Rccu) ı= 8, INTFLP
> FRESTR
Str ins-Fla9 loescher
Stringlaenge ins YR
1%
cBr ©4 EBERSIC
BRSIC-Funktion ASC
46937 JSR
46998 BEQ
46992 LDY
46994 LDRA
46996 TRY
46997 JMP
47202 JMP
GETBYT:
47003 JSR
470806 ISR
47099 JSR
47’al2 LD«
478014 BNE
4’ale6 LDES
47018 JMP-
46973
47900
#0
234) ,Y
4+3956
45648
115
44426
45496
188
47208
101
121
BRSIC-Funktion WAL
ara21 JSR
47024 BNE
4726 JMP-
47029 LD*
4’a31 LDY
47033 ST
47335 STYr
47037 LO“
47439 ST*S
47341 CLC
arag2 ADC
47844 STA
470456 LD*S
47843 ST
4’o5a BCC
47852 IN“
47053 STAA
47055 LDYV
4’a57 LDA
47053 PHR-
47088 TYA-
araeı 5TA
47063 JSR
47066 JISR
47869 PLA
4’a78 LOY
47072 STR
4’a74 LDX
47076 LOüY
47078 STA
47880 ST'r
4’a82 RTS
46973
47023
47331
122
123
113
114
34
122
34
365
35
123
47053
37
#40
36),YV
36) ,Y
121
43371
40
36) .,Y
113
114
122
123
> FRESTR,
Stringlaerge = B? Jas
Strina-Flas lceschen
"TLLEGAL QLIANTITY ERROR"
erstes Zeichen des Strings
> «Recu? ı= 8, INTFLP
> "ILLEGAL QURNTIT'Y ERROR"
liesst Zahl im Bereich van @a bis 253 zus BASIC Text ins XR
> CHRGET holt naechstes Zeichen
> FRMNUM,. FRMEYL numerischen Ausdruck auswerten
> FLPINT, falls negativ "ILLEGAL QUANTITY ERROR"
Byte hiah des Yehoiten Rusdrucks = 8?
Nein: Wert aroesser als 255, "ILLEGAL QUANTITY ERROR"
Byte lou des seholten Rusdruck ins XR
> CHRGOT holt letztes Zeichen
> FRESTR, Strina-Fl293 loeschenr
Stringlsenge = 8? Nein: weiter kei 47929
> FRC :ı= 8, fertig
CHRGET-Pointer
in <11237/114) zufbeuwahren
Str ing-Anfangsadresse
in CHRGET-Pointer bringen
Adresse des ersten Zeichens nach dem String
nach (386737> bringen
erstes Byte nach dem String
auf dem Stack zwischenspeichern
und durch Null <als Trennungszeichen? ersetzen
> erstes Zeichen des Strings holen
> String in Fliesskommazahl nach FRC bringen
erstes Bvte nsch dem String wiederherstellen
CHRGET-Pointer wiederherstellen
GETRDR und GETBYT: Lesen einer Adresse und eines Bytes
470933 JSR
47036 JSR
478989 ISR
47’a92 JIMP
44426
47995
44797
47006
> FRMEYL, FRMNUM wertet numerischen Rusdruck aus
> GETRDR bringt Adresse aus FRAC nach (209021)
> CHKCOM prueft, cb Komma folgt
> GETBEYT holt Byte ins XR
191
452337
ed — I 12
>44 SHSIC
we - - - - = - + "9275
GETRODR: Lesen einer Adresse im Bereich »von @ kis 65535
47095
47097
470993
47101
47103
47105
47108
47118
47112
47114
471165
BRASIC-Funktion PEEK
47117
47113
47120
47122
47123
47126
47128
47130
47131
47132
ar134
47135
47137
BRSIC-Routine POKE
47140
47143
47144
47146
47143
BASIC-Routine WAIT
47149
47152
47154
47156
47159
47161
47164
47166
47168
471709
47172
47174
47176
LDA
BMI
LDA
CMP
BCS
JSR
LDA
LDY
STYr
STA
RTS
LDR
PHR
LDA
PHRA
JSR
LD'Y
LDA
TAY
PLR
STAR
PLA
STA
IMP
JSR
TR
LD'Y
STR
RTS
JSR
sT«
LD*
JSR
BEO
ISR
STK
LDY
LDR
EOR
AND
BEQ
RTS
1092
47008
21
28
el
45936
47083
40
20) .'r
47033
v3
#0
121
47/164
47039
4
#0
20) ,'Y
74
73
47168
Arithmetik: FRC :
47177
47179
LDA
LD'Y
#17
#191
47181 JMP 47207
“orzeichen van FRC .
negativ? JIas "ILLEGAL QUANTITY ERROR"
Exponentkyte von FRC
gsroesser 16 «145 — 123 = 17
Jas "ILLEGAL QUANTITTY ERROR"
> GK-Zahl in 16-Bit-Integerzahl oahrıe Yarzeichen umwandelr:
Adressbyteser vertauschen
und nach -29.’21> kringer
20.’21) auf Stack retten, falls (20.213 won
aufrufender Rautine nach benaetiat wird (z. B. POKE>
> GETROR krinst PEEK-Adresse nach .“29721>
Inhalt der PEEK-Rdresse ins YR
c2a,.’21> wiederherstellen
> «Rccu> := @, INTFLP
> GETROR. GETBYT
Byte (zweiter Parameter)
in POKE-Adresse speichern
> GETROR, GETBYT
zweiter WAIT-Parameter nach (73?
Ersatzwert fuer dritten WHIAIT-Parameter
> CHRGOT holt letztes Zeichen
folst Trennzeichen? Ja: weiter kei 47164
> CHKCOM, GETEYT
dritter WAIT-Parameter nach (74)
Inhalt der WAIT-Adresse
EXDOR mit drittem Parameter
AND mit zweitem Parameter
Ergeknis = 8? warten ...
+ FRC
<Accu/YR? := 48913
> FRC ı= FLP-Koanstante + FRC
192
cBEnN S4+ PFBRHSIcC WW - - - - - - 471254
Aarithmetik: FAC ı= ARG —- FRAC
47184 ISR 497756 > Konstante, auf die (Accw’YR) zeigt, nach ARG
47187 LDRA 102 Vorzeichen von FRAC invertieren
47189 EOR #255
47191 STA 102
471933 EOR 11@ und mit Vorzeichen von FRC verknuepfen
47195 STAA 111 Ergebnis nach (111>
471397 LDRA 37 Expanent „on FAC “falls FAC = 8)
47193 JIMP 472108 > FRC ı= ARG + FRC
Aithmetik: FRC := ARG + FRC
47202 ISR 47513 > Exponenten von FRC und ARG einander anpassen
47205 BCC 47267 Unkedingter Sprung
47207 ISR 47756 > Konstante, auf die (Accu YR) zeigt, nach RARG
47210 BNE 47215 FRC = 0? Nein: weiter kei 47217
47212 IMP 48124 > FRC := ARG
47215 LOS 112 Rundungkyvte fuer FRC
47217 ST“ SE nach 86> kringen
47212 LD# #105 KR als Offset-Pcinter fuer ARG laden
4/2221 LODA 195 Expcanent-Bvte var ARG
47223 TAY
47224 BEQ 47176 ARRG = a? Ja: RTS
472268 SEC
47227 SBC 37 Exponentkyvte „san FRC suktrahieren
47223 BEQ 47267 Exponenten gleich? Ja: weiter bei 47267
47231 BCC 47251 Expanent „van FRC groesser? Taı weiter kei 47267
47233 STY 97 Expanent van FRC durch Vorzeichen won ARG ersetzen
47235 LDY ı1a “arzeichen van FRC durch Yarzeichen von ARG ersetzen
47237 STV 182
47232 EOR #255 Vorzeichen der Expanentendifferenz wechseln
47241 RDC #0 ‘Carry = 1)
47243 LDY #0
47245 STY 8s& Rundungsstelle loeschen
47247 LOX #37 “«R als Offset-Pointer fuer FRC laden
47249 BNE 47255 Inkedinster Sprung
47251 LDY #0
47253 STTr 112 Rundungsstelle warn FRAC loeschen
47255 CMP #243 Differenz der Exponentern sroesser 7?
47257 BMI 4d7’2a2 Ja: Mantissen aneinander anpassen
37259 TA'Y
4’2e80 LODOA 112 Rundungastelle van FRC
47262 LSR 1,
47254 ITSR 47536 > Angsleichen durch Verschieben der Mantisse
47267 BIT 111 Vorzeichen von FRC und ARG identisch
47269 BPL 47358 Ja: Addition der Mantissen, weiter bei 47358
47271 LDYV #97 YR als Offset-Pointer fuer FRC laden
47273 CP* 4105 Ist &R als Offsetzeiger fuer RARG initialisiert?
47275 BEOQO 47279 Ja: weiter kei 47279
4/7277 LDY #105 YR als Offset-Pointer fuer ARG laden
47279 SEC Mantissensuktr aktion
47280 EOR #253
47232 ADC SE Rundungsstelle
47284 STA 112
472886 LDA 4,Y
47289 SBC 4,"
472931 STA 101
47233 LDA 3,Y
47296 SBC 3,8
47238 STA ag
193
CEri
Arithmetik: FAC := ARRG + FRC (CFortsetzung)
47306
47303
47305
47397
47318
47312
47314
47316
47319
47321
47322
47323
47325
47327
47329
47331
47333
47335
47337
47339
47341
47343
47345
47347
47349
47351
47353
47355
47357
Mantissenacddition bei
47358
47360
47362
47364
47366
47368
47370
47372
47374
47376
47378
473890
47332
47394
473896
47389
47391
47393
47395
47397
47339
47401
47403
47494
474086
47408
47410
86
112
101
78
47339
9
47351
4255
#1
Neyativer Uekertra93? Neins weiter kei 47319
> Mantisse imvertierenr
FRC normalisieren
Accu
Rundungsstelle loescher
Zaehler fuer Bitwverschiekung (8 Bits verschoben?
Bereits um 32 Bit verschaben?
Neins zurueck zum Anfang der Schleife
alle Bytes der Mantisse sind gleich 8,
also ist auch FRC gleich ®8. Vorzeichen und
Exponentbyte werden daher auf RA gesetzt
identischem Yoarzeichen
Rundungsstelle
> Veberlaufkit; falls ncetiya, in Mantisse zurueckshitfter
Bitzaehler erhoehen
FAC so lange nach links verschieben, kis das
hoechstwertigste Bit der Mantisse wesetzt ist
Binaerexpaonert kleiner als Anzahl YVerschiektungen”
Jas Underflou,. Zahl wird als GA behandelt
Exporent um Anzahl der Verschiebungen vermindern
194
+ >09
(en © + EBSAn>Slcl zZ - - - - - - +41
untissenaddition (Fortsetzung?
s”g12 STAR 37
47414 BCC O2 47430 Ist die Carrv-Flas durch Vekerlauf sesetzt? Nein: RTS
37316 INC 237 Exponent um eins erhoshen
17418 BEO 47486 leker lauf im Expanenten? Ja: "OVYERFLOW ERROR"
7420 FOR 98 lJeberlaufkit in Carrv in Mantisse zurueckschieken,
47422 ROR 33 Carr» erhzaelt Position des haechstwertigasten Bits
17324 FOR an
i7426& ROR 101
7423 ROR 112
s3743a RTS
-arzeichen der Mantisse invertieren (kei negativen Ersebrissen?
47431 LOA 102 Einserkomplement der Mantisse von FRC Kilden
7432 EOR #255
47435 STA 192
7437 LOR 98
27432 EOR 4255
27441 STA 38
4?’443 LOR 39
27445 EOR 4255
479447 STA 39
17443 LDA 190
7451 EOR #255
37453 STA 1a
47355 LODOR 101
47457 EOR #255
47459 5STA 101
ı’4sl LOA 1iz
4ı74&2 EOR #255
37455 STA 112
47467 INC 112 Mantisse um eins erhoehen
7469 EBENE 474935
37471 INC 191
47473 BNE 47435
7475 INC aa
47477 BNE 47485
47473 INC 32
47481 BNE 47495
47483 INC 33
37485 RTS
74585 LDE #413 Code fuer "OYERFLOLU"
47485 IMP 42033 > Fehlermeldung, RERDY.
wsechtsuerschieben eines Registers
LD« #37 «RER als Offszset-Pointer fuer Funrktionszsresister laden
47491
37433 LDY 4.8 Rechtsuverschiebung um ein Byte
37435 5T'r 112
47497 LD'Y 3.8
37499 ST'Y +.%
y5al LDY 2.4
47503 STY 3.8
47595 LD'Y 1,*
37507 STYr 2,8
47507 LD’Yr 104
37511 ST'Tr 1,x
47513 ADC #3 Bit-Zaehler um 8. erhoehen
47515 BMI 47433 Groesser 97
47517 BEQO 474923 Nein: weiter „erschieken
195
EN ©&4 EASIC „zZ - - - - - -
Rechtsverschieken eines Reqaisters
47519
47521
47522
47524
475326
47528
47530
47532
47534
47536
475383
47540
47542
47543
47544
475465
47547
SBC
TA'rYr
LDF
BCS
ASL
BCC
INC
FÜR
ROR
ROR
FOR
ROR
ROR
INY
BNE
CLC
RTS
#8
BRASIL-Funktion LOG
Fortsetzung?)
BEit-Zsehler um 5 vermindern
Erseknis = O7 . Fertia,
hosechstwertiges Bit
=1? Nein: weiter hei 4332
hoechste Mantissenstelle um eins erhaehen
zssemtliche Stellen um ein Bit nach recht schieken
Tabelle mit Fliesskoammakoanstanten
47548
47553
47554
47553
47564
47563
47574
47620
47622
47624
476453
47648
47649
47652
47654
123
ie
127
128
128
130
128
123
128
128
ISR
BEN
BPL
JMP
LODR
SBC
PHR
LDA
sSTA
LDR
LD'Y
ISR
LDR
LD'Y
ISR
LOA
LOW
ISR
LDA
LO'Y
JSR
LDA
LO
ISR
PLA
JISR
LDA
LDY
a
3
15
24
13
113
Se
33
53.
128
49
17
11
4s171
4r’601
47604
45544
Ir
#127
#123
Erz
#214
#195
47207
#219
#185
47887
#133
#195
47194
#193
#185
Sr4ill
#224
#185
47207
45514
#223
#185
3
& 2
=
= =
a
4
4
a
4
a
Bit-Zsehler um eins erhoehen
und weiter verschieben. kisr Zaehler = &
a 1
Polvrncomarad
121 a.434255942 4 Koeffizienten
1094 a.5786334541
22 a.96512a07353
32 2. 8353947”
22 a.r’arıiasY’sl SIRLA.TI
2 1.41421356 SORı2)>
a -a,.2
243 a.893147131 ln 2
> pruett zuf Yarzeichen und &
Argument = 47 Ja: "ILLEGAL QUANTITT ERROR"
qgroesser RA? Ias weiter kei J4radd
> "ILLEGAL QUANTITTYT ERROR"
Expanentkyvte von FRC
128 zußktrahieren (Carry ist gelsescht)
Exponent sauf Stack retten
Jetzt gilt: 9.2 <= FRC £ 1
Acc RD) = Yard. Startadresse „van ZQRı.a, 57
ı= Konstante + FRC
475793. Startadresse san SORUZE)
> FRC
Accu’ TR) :=
Konstante . FRC
47543, Startadreszse „on 1
> FRAC :=
Acc TR) ı=
Konstante + FRC |
ı= 47553, Adresse des Paoalvnomar ads
> FRC
Accu ’R)
-
> Palvrnomauswertung
Acc TR) 3= 4/aS4, Startadresse von —-4.5
> FRC ı= Konstante + FRC
Expanent vom Stack holen
> "Kennzahl" berechnen: Rccu zu Mantisse addieren
Rec YR) ı= 47599, Startadresse von In 2
196
cErf SS BHSIcCc VZ = = Ar Mr - .- ne rd tn T =
rithmetiks FRC := ARRG * FRAC
47656 IJISR 47756 > Konstante, auf die (Accu/’YR> zeigt, nach ARG
47659 BNE 4r7ösd4 FRC = 9? Nein: weiter kei 47664
476681 IMP 47755 > FRC := ARG
37664 ISR 47799 > Exponent des Ergebnisses durch Radition berechnen
437667” LOA #40 Register fuer Funktionen initialisieren
47669 STA 38
47671 STA 39
47673 STA 4a
47675 5TA +1
437677 LDR 112
476793 JISR 47705 > Multiplikation
47682 LDA 1091
47884 ISR 47705 > Multiplikation
47687 LDA aa
47889 ISE 47705 > Multiplikation
47692 LOA 39
47694 ISR 477053 > Multiplikation
47637 LOA 38
476993 JISR 47710 > Multiplikation
477’az IMP 48015 > Register fuer Funktionen nach FAC, FRC normalisieren
47705 BNE 47r7ıa
47var7 IMP 47491 > Resister fuer Funktionen nach rechts verschieken
47710 LSR
47711 ORR #128
+7713 TAT
4’v14 BCC 2 47vdl Binsere Multielikstian des Accus mit ARG, Ergeknis ins
4rris CLC Register fuer Funktionen. Fuer jedes gesetzte Bit im
47’vYir LODA 41 Accu wird ARG zum Funktiaonsregister addiert, unabhaengig
477193 ADC 129 davan wird das Funktionsregister verdoppelt.
47’v21 STA 41 Prinzip siehe auch 459a4)
47723 LOA 4a
47725 ACC 103
4rv’z2r7’ STA 4a
47723 LOR 33
47731 ADC 147
47733 STA 33
47725 LDRA 33
477237 RDC 16
47739 STA 33
47741 FOR 38
477423 FOR 33
47745 FOR nis)
47747 RüRr +1
47743 FÜR ilz
47751 TrA
‚rsz2 LSR
Tra=3 BNE 47712
47755 RTS
konstante, zuf die “Accu tR) zeiat. nach ARG, Arithmetik vorkereiter
ton STA 24 Konstante. auf die ÜAcce"rrR) zeigt, nach ARG
47728 5TT 35
+rrea LOYV #4
47’v’sz LOA DET: Sy BR
477e4 STA 103
47765 DET
4778 LOA Der Se nn u
197
Er 54 BRSIC WZ - - - - - - u
RArithmetik: FRC := RRG * FRC (Fortsetzung?)
477689 STA 148
47771 DEY
a’v7’2 LOA 343 ,Y
47774 5TA 1097
47776 DEY
47777 LDR 34)>,Y
47773 STR 118 “Vorzeichen var FAC und ARG verknueptfen
47751 EOR 192
47783 STA 111
47785 LDA 110
47737 ORRA #128
47733 STA 1a6
47791 DET
47792 LDA 34) .Y
47794 STA 195
47738 LDA 97 Expconent »on FAC Salz Kennzeichnuns, falls FAC = ©
47798 RTS
47799 LDA 1905 Expanernt von ARG = 097
479801 BEO 47834 Ja: Ruecksprungadresse Jam Stack holen, FRC := 0, RTS
47803 CLC
47804 ADC 97 Expcanernten van FRARC und ARG addieren
47806 BCC 47812 |
47808 BMI 47839 leker lauf im Expanenten? Ia: "OVYERFLOW ERROR"
47310 CLC
47811 BIT nu e
47’S12 BFL 47836 Under flau? Jas FAC := a, RTS
47314 ROC #123
4vY’Ss16 STA 97 ersikt Expanenten won FRC
473153 BNE 47823
aqrsza IMP 47353 > FAC sı= 8, RTS
47823 LDRA 111 Verkruepfung der VYarzeichen von FRC und ARG
473825 STR 102 als Yarzeichen des Ersgeknisses in FAC speichern
47827 FRTS
47828 LDA 122 Vorzeichen pasitin,? “uql. EST)
47830 EOR #255
47332 BMI 47839 Ja: "QVYERFLOW ERROR"
47334 PLA Inderflow: Ruecksprungadresse om Stack
47335 PLA.
47236 IMP 47351 >= FAC := a, FTS
47339 IMP 47496 > "OVYERFLOU ERROR"
Arithmetik: FRAC := 10 % FRC
47342 JSR 48148 > FRAC runden. ARG := FRAC
47345 TA Expsment „on FRC
47546 BED 47364 FARC = 07 Ja: RTS
47243 CLC
47843 ADC #2 Binzerexponent um zwei erhoehen Ventspricht 4 % FRAC)
47921 BCS 479339 Vekerlzuf? Ia:s QYERFLOMN ERROR
478353 LDX #9
473593 ST 111
478537 JISE 47223 >» FRC := ARG + FRC “mit ckisem Ersgeknis also # >
47350 INC 37 Binserexpanent um eins erhoehen “entspricht 2 # FRC5
47362 BER 47339 lebkerlauf? Iza: "OWVERFLOM ERROR"
47864 RTS
473865 132 32 a [<! a konstante 14
198
CBM S4+ BASIC vz a 3 . i n e 47970
Arithmetiks FRC := FRC 7 18
47370 JISR 48140 > FRC runden. RRG := FRC
47873 LDA #249 RAecu/YR) :ı= 47865, Startadresse won 18
47875 LDY #136
47877 LDX #0
47379 ST* 111
47881 ISR 489434 > FRC mit Konstante, zuf die (AccwiYR) zeist, laden
47834 IMP 47890 > FRC := ARG .“ FRAC
Arithmetilk: FRC := ARG . FRC
47837 ISR 47756 > Konstante, zuf die (AccwrR> zeiast, nach RRG
478398 BEQ 480108 FAC = 0? Isa: "DIVISION BY ZERO ERROR"
47392 JISR 498155 > FRC runder
47895 LDA #0
47397 SEC
47893 SBC 37 Vorzeichen des Expanenten von FRAC wechseln
47900 STA 937
47902 JSR 47799 > Expanent und Yorzeichen des Ersebrisses bestimmen
47905 INC 37
47907 BEQ 47839 Ueker lauf im Expanenten” Tas "OVYERFLOWM ERROR"
47903 LDS #232 Pointer zuf Funktionsresister (in Zerao-Page zyklisch!;
47911 LODRA #1
47913 LDY 1a6& FAC mit ARG kurteweise vergleichen
47915 CPY 33
47917 BNE 47935
47913 LDY 107
47921 CPY 939
47923 BNE 47935
47925 LDY 1983
47927 CP'Yr 1090
47929 BNE 47935
47931 LDY 143
47933 CP'Y a1
47935 PHP Ststusregister zuf Stack retten
47936 ROLL
47337 BCC 47948
47939 IN“
47940 STA 41,8 Ergebnis in (38,....42> aufbauen
47942 BEQ 47994 sR gleich A? Ta: weiter bei 47994
47944 BPL 47998 *R sleich 1? Ja: fertig, weiter bei 47998
47946 LORA #1
47948 PLP
479343 BCS 47365 FAC <= RRG? Ia: weiter kei 47965
47951 RSL. 1093 ARG verdoppeln
47953 ROL 198
47955 ROL 197
47957 ROL 196
47933 BCS 47935 Vekerlauf? Ja: weiter 47935
47961 BMI 47913 hoechstwertiges Bit gesetzt? Ja: weiter kei 479713
47963 BPL 47935 sonst weiter kei 479335
47965 TAY Mantisse won ARG minus Mantisse von FRC
47966 LDA 1099
47968 SBC 101
47970 STR 199
47972 LDA 1383
47974 SBC 198
47976 STA 198
47975 LDA 197
47980 SBE 939
47982 STR 197
47984 LDA 106&
199
CcBMN S4 BRSIC Ww2Z - -
RArithmetik: FRC
47936
47938
47998
47991
47994
479396
47993
47993
43000
4saa1
43002
42aa3
45004
"4206
43007
asa1la
43012
43015
43417
43019
43c21
43023
43025
43a27
saz23
42031
SBC
STR
TYA
JMP
LDA
BNE
RSL
ASL
RSL
ASL
ASL
ASL
STA
PLP
JMP
LD*S
IMP
LoA
STA
LDA
STA
LOA
STA
LEA
STA
IMP
#64
47948
112
43013
#24
42039
383
38
39
99
49
ı1aG
41
a1"
473193
+’ 93S8&
ı= ARG FRC (Fortsetzung)
Unkedinster Sprung
Accu) ı= 84 % (Accu)
ergibt Rundungsstelle
> Ergekris nach FRAC, FAC normalisieren
Code fuer "DIYISION By ZERO"
> Fehlermeldung, READY.
Register fuer Funktionen nach FRC uvebertragen
-
> FRC linkskuendiga machen
Kanstante, auf die “ARccuwYR)> zeiat. nach FRC <Speicherformat in Registerformat>
48034
430365
43028
48040
45042
43044
45045
48047
430493
4gasa
43052
48054
48055
48957
4859
43051
43053
42064
4506656 5
43063
4zara
STA
STr
LO'Y
LOR
STA
DE'Yr
LODA
sTtA
DE'Y
LOA
STA
DE'Y
LDA
STA
ORR
STA
34
35
#4
34) ,'Y
161
34) .Y
108
345 .'Yr
933
34) .Yr
102
#128
23
AccurR) nach 34.735)
LSB der Mantisse
MSB der Mantisse “Bit 7 ist Yorzeichenflag?
Register fuer Yarzeichen von FRC
Bit 7 <hoechstwertiges Bit? zuf eins setzen
in Register fuer MSB der Mantisse von FRC kringen
Expanentkute
Rundunasstelle loeschen
lehertraguna van FAC an andere Stelle
435071
43073
42074
430786
434073
#22
Zielbkereich (92,....96)
Zielbereich (87,...,91?
Pointer zuf Zielbereich high
InBedinater Sprung
200
c-EBri
>S>+ EHZS>Ic zZ - - - = -
D
ilekertragung von FRC an andere Stelle (Fortsetzung)
43088
493032
43034
43937
42083
48091
42033
43095
43097
423098
43100
43102
43103
431053
45107
481483
45110
49112
49114
48116
48117
48119
45121
48123
LD« r’3
LDY v4
JSR 48155
5ST*x 34
STYr 3a
LD'Y #4
LOA a1
STR
DE'Y
LOA 180
STA
DE'Y
LODA 29
STA 343,
DE'Y
LDA a2
ORA #127
AND 38
sSTRA
DE'Y
LDA 97
STA
STY 112
RTS
lekertr aguna van
48124
451265
48123
43130
43132
43134
45135
43137
43139
LDA 12
STA 182
LD* #9
LOA
sta
DER
ENE 43130
ST 112
RTS
llebertr auuımna „or
481408
438143
48145
48147
43143
ag150
48152
48154
FAÜ runder
a ca ga da od co
Be
u u Ce | a |
I u a We EN u Bu Br
JSR 43155
LO #6
LOR IE.#
STA 1a4.:
DE:
EHE 451475
ST“ i1l2
RTS
I_DA 3,
BEU 42124
RSL 112
eicl 342124
JerR 0 4741
EHE 43154
IMP 44
243 ,Y
3453 ,Y
34) ,Y7
343,7
1a4 ,x
I8,R
Startadresse des Zielkereichs in (Y3/74)
> FRC runder
Zeiger auf Zielkereich setzen
FAC in Zielkereich uvekertr agen
LSB der Mantisse
Vorzeichenkvte fuer FRC
Bits @ kis 6 fuer "RAND" zuf eins setzen
und MSB der Mantisse hineinkringen
cMSBit wird durch Yarzeichenflag ersetzt)
Exponentkute won FRAC
Rundungstelle von FRC loeschen
nach FRC
VYoarzeichenbvte van ARG
- u tn Din
in Reaister fuer Yarzeichen „an FAC uvekertrasen
Fundunastelle „an FRÜ loescher
nach AFG
= FRAC runden
Rundumnasstelle von FRC lceschen
Ex:ronent = da Waisco FHAl = 057
Ja: FRTS
Runddunmaszstelle 2 12987
Ja: FTS
> Mantisse um eins erhoehen
Matisse jetzt ruıll? Nein: RTS5
= Mantisse nach rechtz schieken, Expaonernt
201
erhoehen
CEr S+ BrRSIc WVZ2 - - - - - -
Vorzeichen von FRC pruetfen
43171
43173
48175
48177
4531783
43180
481832
451234
LDA
BEQ
LDA
ROL
LDA
BCS
LDA
RTS
97
43184
122
#255
43194
#1
BASIC-Funktion SGH
48135
45188
481970
48192
43194
48196
43198
43208
43201
43203
43205
43207
43209
48211
43213
JSR
sTA
LOA
STAR
LD«
LDA
EOR
ROL
LOR
STA
sta
ST“
sta
STA
JMP
43171
938
#0
39
#136
38
#255
#0
181
aa
97
112
122
47314
BASIC-Funktion ABS
43216
48218
Zahlerweraleich zwischen FRC und Konstante,
48217 5
49221
49223
43225
43227
45228
43223
43231
48233
43235
43237
43223
43241
43243
43245
43247
43249
43254
43232
43254
43256
48257
43259
43261
43253
43264
43266
LSR
RTS
182
Ergeknis der Pruefungı
I FRC IAccu IC-BitizZ-Bit IN-Bit|l
I a ıı a ı 98 ı a )
I=8a|I a I uw I 1 ıa ı
ıIi<zoa ı 255 1 1 ıa ) 1 |
2
Vorzeichen van FRC pruefen \l, a. 255 fuer +,
Expanertkbvte fuer Eraeknis
Expcanentkute fuer FRC
> Invertieren.
> Bit 7” im VYarzeichenkvte „on FRÜC lcoeschen
zuıf Jdie "Accu TR) zeit
Pointer surf Kanstante setzen
Expanentkuvte der Konstanter
Expconent = 47 Iza: Yaorzeichen „on FRC pruefen
hoechste Stelle der Konstanten
Yoarzeichenkhurte „an FRC
Vorzeichen unterschiedlich”
Expanenten veraleicher
unterschiedlich? Ja; weiter hei 42274
“orzeichenkit in Yersleichzahl setzen
NSBzE Vergleichen
zweite Stelle vergleichen
dritte Stelle Jeraleichen
.
Fundunasstelle von FRC mit 127 veryleichen
202
J!Jas weiter kei 48175
a,
+Z3171
=>
+alls regatio und linksbuendia machen
CcPrI &4 BRAZ>SIC Ww=Z - - - - - - un dr
Zahlerwergaleich zwischen FRC und Kanstante “Fortsetzuna?
48268 LOA 367 ,'r Letzte Stellen voneinander zuktrahieren
43278 SEC 11 mit Carr» semaesz Vergleich der Rundungasstelle
43272 BEQ 453194 Alle Stellen 3leich?” Tar RTS
48274 LODA 1932 Vorzeichen won FRC
49327& BCC 48280 Konstante < FAC? Ias weiter bei 4280
43278 EOR 4253 Accu imwvertieren
43288 IMP 48177 > Yerqgleichsroutine fuer &
Umwandlung einer Fliesskaommazahl in Inteser:
48233 LOR 97 Expcanent san FRÜ
43235 BEQ 48361 = a4? Ja: weiter kei JS361
48287 SEC
48288 SBC #160 Integer -Expanenrt
43290 BIT 102 FRC pasitiv?
43292 BPL 43303 Ja: weiter hei 4S3a3
43294 TAX
43295 LDA 4235
432937 STR 104
43299 ISR 47437 = Mantisse von FRÜ imwertieren
453042 TXA
43303 LDX« #97 SR als Offset-Pointer zuf FRC
43305 CMP #249 Expanent ygroesser als -3?
43307 BPL OA 48315 Ja: weiter bei 43315
438309 ISR 47513 | > FAG mach rechts verschieben. biz Expanrent = Ad
48312 ST'Y 194
48314 RTS
48315 TfA'r
43316 LDRA 102
48318 AND #128 Vorzeichen izsalieren
438320 LS5R 93
48322 ORR 38
43324 STA 938
48326 JSR 47536 = FRC nach rechts verschieben (mit Carrw>
43329 STY 104
48331 RTS
BASIC-Funktion INT
48332 LDA 37 Expaonentkute von FRC
48334 CMP #150 aroesser «der „sleich 184 KFAÜ also zawiescı Yyanzzahlia>”
43336 BCS 48370 Ja: RT5
48338 JSR 483283 > Fliesskanmmazahl in Inteser umwandeln
48341 ST'r 112 Rundmasstelle lceschern
43343 LDA 102 Vorzeichen in Accu bringen
43345 STYr 192 Vorzeichen positiv machen
48347 EOR #128
48349 ROL Carrv kei nmesativem Yorzeichen loeschen
483580 LDA #160
438352 STR 97
48354 LDA 101
43336 STA 14
48358 IMP 47314 > FRC linkskuendig machen
483651 STA 28 Mantisse von FRC mit Hullen fuellen
48363 STA 39 ziehe 43235)
48365 STA 198
43367 STR 101
48369 TAY
48370 RTS
203
CO Er
STRFRAC.
Eindake:
4837
4337
4837
4837
4837
48383
483332
48284
482336
43388
4333
482392
43334
4237
48333
42421
43403
42405
43407
4241
43412
43414
42415
43413
43420
48422
42441
48443
42444
42446
42449
42451
9453
LO
LD»
SsTYr
DE*
BPL
BCC
CMP
BNE
sTa
BEQ
LMP
BHNE
JSR
BCC
CHP
BEÜ
EMP
EBENE
JSR
BCC
cHP
BEU
CMP
BEU
CHP
BEQ
cHP
BEU
BNE
ROrR
SR
BIC
EIT
EL.
LODA
SEC
SBC
IMP
RÜr
BIT
EWC
LOA
SEC
SB
STA
BEU
BI.
ISFR
INC
BNE.
BEU
erstes
D ‚r
#423
482399
115
42490
#46
48449
#59
48455
115
42435
#171
42430
#45
48430
#170
48432
443
48432
48437
„
er
CHRGET-Pceinter auf erstes Zeichen des Zahlenstring,
Zeichen im Accu
793,0... .103) mit @ varkesetzen
zeichen Ziffer? Ta: weiter bei
ceade fuer '"-'"7?
Nein: weiter kei 43390
103) := 255. Yorzeichenflayg setzen
Iinbedinater Sprung
Cade fuer "+"
Hein: weiter kei 43333
> CHRGET halt naechstes Zeichen
ziffer?” Ia: weiter bei 48494
de fuer "„"?7
weiter hei 48449
de fuer "E"?
ein: weiter kei 4834595
> CHRGET halt nasechstes
ziffer”?” Ia:r weiter 434353.
BASIC-Coade fuer "-'"?
weiter kei Ja43a
ARSCII fuer "—-"?
Jas weiter hei 4434
BASIC-Code fuer "+'?7?
Ja: weiter kei 43432
RSCII fuer "+'7
Tas weiter kei 43432
er=tes
‚a
Ja
a
zaanN
Zeichen
Ia:
Bit 7 von (96) setzen
= CHRGET holt naechstes Zeichen
Ziffer?” Ia: weiter kei 48529
Bit 7” van (96) sesetzt”
Nein: weiter kei 43453
Hegati.er Expanents
Aufruf durch Dezimalpurkt
kereitz zweiter Dezimalrunkt”?
Nein: weıtermachen
gelesene Zahl yemsese Paeition
des Dezimalpunrnlts
und Expanerten anpasser
204
Umwandlung eines Zahlenstrinas in eire Fliesskommazahl
43397
weiter kei 43523
“"orzeichen des Expanenten wechseln
c-Er1
Imwandlung eines Zahlenstrings
48475
48475
43484
48432
48484
42436
498497
48494
45491
48493
43495
43437
435g
48501
43702
48504
43507
48514
48511
48514
48515
49518
48524
43522
4anzd
49325
48323
43331
48333
48735
48337
433393
45541
48544
49545
+ RFRH>SIc
JSR
DEC
BNE
LOA
BMI
RTS
IMP
PHR
BIT
BPL
INC
ISR
PLA
SEC
SBC
JSR
IMP
PHR
JSR
PLA
JSR
LOR
EOR
STA
LOS
IMP
LORA
CMP
BCC
LOA
BIT
EMI
JMP
RSL
ASL
> CLC
” RDC
ARSL
CLC
LO
AD
SEC
SBC
STR
IMP
47842
34
#48
48510
48394
43140
43138
119
102
111
97
47210
34
Ha
48544
#100
365
43558
47486
> FRC
gelesene
= FRC # 10
Geleserne Zahl neuativ?
Ja:
-
Aufruf durch Mantissenzitfer
> Yarzeichen
„an FRC wechseln
Vorkommastelle”
Ja: weiter bei 43497
Zaehler fuer Anzahl Nachkommastellen erhoehen
> FRC
ASCII in Ziffernwert
> Ziffer zur Mantisse won FRC addieren
ı= FRC %* 1
> naechstes
> Accu in hoaechste Stelle „von FRC kringen
Zeichen
Yarzeichen van FRC
und Vorzeichen van ARG
miteinander verknueptfen
= FRC
Rufruf durch Expomentenziffer
= ARG
+ FRC
Yarzeichen imvertieren
holen
dritte Expanentzitfer?
weiter bei 48544
Nein:
Vorzeichen nregati.”
Ja: Undeflou.
> "GWYERFLOU ERROR"
Expament mit 10 multiplizieren
und neue Fxpaorentzifter addieren
gelesene Zahl als Null behandeln
3333339
wo
chste Ziffer holen
205
zon a kis 9 umwandeln
in eire Fliesskommazahl (Fortsetzung)
+34 075
Zahl Yemaess gelesenem Expoanenten anpassen
cCcErn S4 ERSICcC vw - - - - -
423575
Rusgake der Zeilennummer kei Fehlermeldungen, ’LIST” etc. <Einsprung 48589)
43378
435534
493582
48585
493587
435333
43591
435933
48593
43596
43599
436502
Umwandlung
43503
48607
436069
49611
43613
49615
43618
486208
48622
48623
49625
43627
493629
43632
435634
43636
43638
43640
43642
43644
43647
48649
43651
43633
436595
43633
49584
43662
43664
436568
4356593
43671
43673
493576
43678
43638
43633
42635
43687
43538
493693
43695
43697
43698
43708
LOR
LOD'Y
JSR
LOA
LDOX
STR
STK
LD%
SEC
ISR
JSR
IMP
LEN
LORA
BIT
BPL
LOA
STR
STR
SsTVv
INY
LDR
LD*«
EBENE
JMP
LOR
CP*
BEQ
BCS
LOA
LOW
JSR
LDR
sta
LDA
LDY
JSR
BEQ
BPL
LDA
LD'Y
JSR
BEQ
BPL
JSR
DEC
BNE
JSR
#113
#153
43642
58
37
98
39
#144
42201
43607
43306
von FRC in
#1
#32
182
43515
445
233,YV
192
113
#443
a7
43632
48904
#0
#125
43640
43649
#133
#189
47656
4247
33
#184
#189
432173
43630
48634
#179
#199
432193
43673
43687
47342
eRc-cHTR? 3= 41941, Startadresse von " IN "
> Rusaske „an " IN "
laufende Zei lennummer fuer ERRÜR
in die heiden hoechsten Stellen von FRAC
Expanent :ı= 1& (144 — 123 = 15?
> wekrige Stellen warn FRC mit Null fuellen
> FRCSTR wandelt FRAC in String ak 2565 um
> String drucken
einen Zahlenstr ing
Zeiger auf Stringkereich
Code fuer Space (Yarzeichen fuer poasiti.e Zahl)»
“arzeichen an FAC
peositiw? Jar weiter kei 49615
Cade fuer "-"
in erste Stelle des Stringkereichs krimaen
ASCII fuer Null
Expanent = 0?
Nein: weiter kei 48
>
32
> RSCTI-NUll nach ”.
&
be Endezeichen nach
Expamentkute san FAC = 1237
Ja: 0,5 “= FRC < 1, weiter kei 434840
FAC >= 1? Ia: weiter bei J3549
Accu VR) ı= 49573, Startadresse von 1E+43
> FRC := Konstante % FRAC
entspricht -3 .
.933> = -9. falls FAC X 1. sonst (9335
Acc VRR) 9= 4HIE8, Startadresse san 333333339
> FAC mit Konstante versleichen
Accu YR> 3= RSÄR, Startadresse warn 399993993. 73
> FRC mit Kanstante „eraleichen
>= FRC := 10a %* FRC
Dezim=lexponent vermindern
> FRC s:= FRC / 1a
Dezimslexponent erhoehen
= FAC := 8.5 + FRC
> Fliesskommazahl nach Integer umwandeln
FRE liegt rum im Bereich von 1ES his 1E9
93) enthaelt den Betrag der
korrigierenden Zehnerpatenz
Betra3 der Zahl < 98.81?
Jas weiter bei 48711
RTS
CBM S4 BASIC vz R z ® u E E 43 70Z
awandlung von FRC in einen Zahlenstring (Fortzetzuna?
42702 CMP #11 Betraa der Zahl > 1E9?
48704 BCS 43712 Jar weiter bei 48712
43786 ADC 4255
48708 TAX
48709 LDA #2
48711 SEC
48712 SBC #2
48714 STA 24 Expanenti=ldsrstellungsfl24 (= wenn „@al <= Betrag < 1E9)
48716 ST 33 Neyativdarstellung des Expoanenten
48718 TXA
48719 BEQG 48723 a.i <= Betraa © 17? Ia: weiter bei 43723
43721 BPL 48742 9.01 <= Betraa Z 4.17 Nein: weiter hei 43742
48723 LDYV 113
48725 LDRA #46 ASCII fuer ".„"
48727 INY
48728 STA 2355 ,'Yr in Stringkereich krinsen
48731 TXRA
48732 BEQ 48748 a.1 <= Betr=a <{ 1? Ia:s weiter kei 43740
48734 LDA #43 ASCII fuer "0"
48736 INY
48737 STA 255,Yr in Strinakereich kringen
48749 ST'Y 113
48742 LDY #0 Pointer in Takelle mit Stellenwerten
48744 LD* #128
48746 LDA a1 Durch wechzelnde Addition und Suktraktieon
43748 CLC der Stellenuwerte aus der Koanstantentakelle
48749 ADC 48921 ,.'r werden die einzelnen Ziffern des Zahlenstr inas
48752 STA 121 ksrechret.
48754 LDRA 1a
48756 ADC 493920,.'7
487393 STA aa
48781 LODRA 39
43763 ADC 498919,.Y
48766 S5TA 239
48763 LDA 98
48770 RDC 43918,Y
48773 STR 983
48775 INA
48776 BCS 45782
48778 BPL 48746
48730 BMI 457934
43732 BMI 49746
48734 TXA
435785 BCC 48791 Komplement addiert? Hein: weiter bei 437931
48787 EOR #255 Ergekris kezueslich 12 komplementieren
48789 ADC 410
48791 ADC #47 eraibt Zifferncoode
48793 INT Tzbellernzeiger zuf naechste Kanstante fuer
43794 INY Stellerwmerte setzen
48795 INY
48796 INY
48797 5TYr vi
487993 LDY 113 Zeiger auf Stringbereich
438061 INY auf nmaechste Zifferpcositiaon erhueher
43802 TAX
488083 AND #127 Zifferncode
438085 STA 235,7 in Strinakereich kringer
488883 DEC 93
48819 BNE 488123 Einerstelle erreicht” Hein: weiter bei 42812
207
Br
Umwandlung vorn FAC in einen Zahlenstring
48812
48814
48815
48818
48820
48822
48823
499825
48827
48328
48920
43832
48924
48836
43338
48241
48842
48844
43248
493348
48850
43851
48853
49855
Ir)
be En Bay BE sr
OD DD ini
AWEENDTIT EN SUDOUONUMIDDO NUN END ee ID
BRELBLRLLLELLLDLRLRLLLBDrRnL
0 CO
bau Iady u Bas BES Es a BE U BR Su Es a BE CHR se Hs ı Ey Bas En Bas Ba Ba En nt
BL LH
re )
yon
m a
un LE BER
>44 FEHzZSIc zZ - - - = - -
LOA
IN'Y
STR
sT'r
LO
TARA
EOR
AND
TAx
CP'Y
BEQ
CP'Y
EBENE
LO
LOR
DE'Y
ZHMP
BEO
CHP
BEO
IN'Y
LOA
LD«
BEUÜ
BL
LOA
SEC
SEC
TA«
LOA
STR
LOA
STA
TA
LD»
SEC
IN“
SBC
BCS
zlaie
STA
TARA
STA
LOIA
STA
BEN
STAR
LDR
sta
LEA
L.EY
RTS
123
1%)
#255
#128
#35
43336
#60
423746
113
ea,
#43
43333
\.D
EIh9U0 4
NW RG
he |
%
-T
„Y
Fortsetzung?
RSCII fuer "."
in Stringbereich krinmnaer
Pcinter merken
Takellenzeiger
fuer Stellenwerte
Ende der Fliesrskomma-Str ingumwandlung?
Ja: weiter kei 43336
Erde der Umwandlung von Slzstel Sekunden
Nein: kei naschster Stelle weitermachen
in TIF?
letzte „cr Hull verschiedene Stelle suchen
Code Tuer "a"?
Jas weiter hei 433393
Code fuer "."7?
Ja: weiter kei 43321
Code fuer "+" («Expanentialdarstellung)
Fla4 fuer Expamentialdarstellung gesetzt?
Nein: weiter kei 43943
Zehrerexpanent pcositie,? Ja: weiter kei 43367
Betr=u4 des Expanenten berechnen
ade fuer "-"
in Stringakereich kringer
Cade fuer "E"
in Strinakereich bringen
ASCII fuer Zehnerstelle des Expanenten berechnen
Lode fuer Eirerstelle des Expanernten berechnen
in Str ingkereich kringer
Code fuer Zeirerstelle in Strinabereich bringen
Endezeichen
hinter letztes Zeichen setzen
Inkedimater Sprung
Endezeichen
hinter letztes Zeichen setzen
AccostR) = 2585. Startadresse fuer String
[5 leitkommakonstante .5
208
+55 12
wiederherstellen
cC-EBr1
= PeH>STIc
wi ID
Takelle mit Stellenwerten bei kei Umwandlung von Fliesskomma in String
43918
495922
43326
43330
43934
498938
453942
48946
439504
43954 2
43958
BARSIC-Funktian
258
a
255
17a
ıa >31
152
43a09 JISR 45140
49a1l2
4714
Arithmetik:
49016
49013
49a21
49a23
43027
49028
49a3a
49932
49935
49437
490939
49042
49044
43046
49043
49051
49052
490954
LOR
LO
ISR
BEN
LDR
BNE
JMP
LOS
LO'Y
JSR
LORA
BPL
JSR
LDA
LO
ISR
BNE
TTA
LEOD'Y'
ISE
I, TrA
Ja D
un 1)
5
i|
“)
EUMONnDN
FHRH
ISR
LOA
LO
ISF
ISR
FLA
„SF
Ei
#17
#121
FRC
48034
49133
195
49028
47353
#783
#0
420834
118
4954
43332
#73
#0
432193
Yaand
a
128
132
189
& 240
232
156
10
255
123
192
9&
165
153
ein
SsoRr
ARG
- 18290000
1aaaaaaaı
-18009a4
12900908
-1.a0908
1a04
-108
18
1
Dezimale Stellenwerte im Integerformat
zur Berechnung der Ziffern in der
Dezimaldarstellung
-2169498
218a004
3800
S3Eg8
-608
ale
Entsprechende Stellenwerte zur
Berechnung der Ziffern fuer TI$
iva ıva ıvra 17a ır7a
iva ıre ıyYa iva 174
> FARC runden und nach RRG uebertrasenr
Accu tR) 45313. Startadresse von 98.5
T FRC
auf die “AccwYRE) zeigt, nach FRAC
FRC a? Ja: weiter bei 49133
Expanentkvte von ARG
0? Nein: weiter kei 49028
FRC := &
> Kanstante.
e
=
=
Ri}
PX
> FRC nach (73,2... ,.82)
“orzeichen van RARG
rcsitiw? Jar weiter bei 49054
> INT schneidet Nachkoammasteller
kringen
FRC ak
van
> FRAC mit KVS,.....825 vergleichen
Gleich “Exponmert sganzzahli9>? Nein: weiter bei
Accu) := 4 ibert zus Sukrautine 43213)
letzte Expanentstelle
> Betrag von FRC nach RRG
4+93a54
letzte Expanertstelle
>» LOG. FRC := In FRC
= FAG ı= WVYS.....82> * FRAC
> FAC :ı= exp FRÜ
letzte Expanentstelle
Ex:econent aradzahlia”
3: FRTS
209
CP &I4I EFERSTIC
Arithmetik: FRC
49076
493073
49054
49092
49934
49036
LOA
BEQ
LDA
EOR
sTA
RTS
BRSIC-Funktion ExP
Konstantentakelle fuer
43037
49992
49093
490983
49103
493108
49113
43118
49123
49128
49133
49135
49137
49140
49142
49144
49146
49149
123
7
113
11e&
119
122
124
1265
128
129
LODA
LD'Y
JSR
LDA
ADC
BCC
JSR
JMP
.'—_ L_ [ } ; ; [| 1 1
= RRG T FRC (Fortsetzung?
97 FARC = 97
49a3E Ja: RTS
102 FRC := — FRC
#255
192
Ex<P
5& 17a 59 41 1.44269594 1.“ ıin 2
Polvnomar ac
52 883 82 5 2.14937637E-95 Koeffizienten
22 126 179 27 1.43523140E—-a4
47 238 227 133 1. 34226 348E-03
293 132 28 42 3.651401 7B1E-A3
933 893 85 18 . 555951269
117 253 231 198 . 249226335
49 114 24 16 593147136 in 2
a a a a 1
#191 Accu R> := 490987. Startadresse von 1. 44269514
#191 j
47656 > FRC ı= Konstante # FRC
112 Rundungsstelle
480 plus SA
493149 kleiner 256? Jas weiter bei 49149
43163 > Mantisse van FRC um eins erhcaehen
57344 > Fortsetzung in zweitem ROM-Bereich
210
+37
ed —I 02
SI EenslIc = - - - - - - Eu Br gget Zn Zn 2
BRSIC-Funktion EXP «Fortsetzung aus erstem RüOM-Bereich>
57344
57346
37349
57351
37353
37359
37358
57361
37363
57364
37366
37368
37369
57371
57372
37374
37376
57378!
37380
373932
37383
57395
73987
373939
57392
57395
57397
57399
57482
7404
57486
7407
57410
= 1
43143
97
#136
373583
47328
43332
r?
#129
37353
#1
#3
143,8
Polvnomauswertung
Sya4il
57413
57413
57418
57428
57423
57426
57428
37438
57433
57435
57437
57448
57442
57444
57446
57447
57448
57459
s7452
57454
57456
STR
STr
JISR
LDA
JSR
F’SR
LOR
LD'Y
IMP
sTa
STr
JSR
LDRA
sta
LD'Y
INY
TyrA
BNE
INC
sta
LD'Y
JSR
1123
Rundunssstelle + 34
> ARRG := FRC
Expanentkvte von FRC
FRC < 1287 Ia:
> wenn pazitir,
weiter kei 57253
"QVERFLCOH ERROR". zanst Underflaou,. FRÜC:=H
-
> INT schneidet Nachkommsastellen =k
Ganzzahliger Anteil
FARC = 1277 J2: weiter kei 37357
FRC mit ARG vertauschenr
Rundunasstelle
= FRC := ARG —- FRL
= FAC := -FRC
<AccwtrR> :ı= 43a92, Startadresse fuer Palvrcomauswer tıumd
>= Palvenomauswer tung
> Expanenten van RFG und FRÜ addieren
Folvnaonmkerechmung attı+al#: 12422 #1 IH 2387 Hr...
RARedresse des Pcolvraomarads zwischenspeichern
-
= FRC runden und nach Treuen. 31) uebhertra3en
> FRC ı= (837 ..20..,91>
> Polvnamauswer tur
Acc VRR) = 37
* FRC
= FHÜ s= 27.2... .31> # FRAC
Pcolvnonberechrunga alfl+21l#x:+ 328x242 38: t3H 24th...
Adresse des Pcolvromarads zwischenspeicherr
> FAC nach (92,.....96) yekertrauen
Polvncmarad zlz Zaehler fuer Palvnconauswertuna
Zeiger auf Antara der Kaeffizientent=zkelle setzen
ı= Koeffiziert Painter in “Acc tr) # FR.
> FRC
211
CC Er
Pcolvnomsuswer tung
> FHAz>lIc zZ - - - - - -
bee Be = Em Ben
Fortsetzung?
274593 LDA 113
Sy7461 LDY 114
Sr4s3 CLC
Sr4s4 ADC #2
Ssv4s68 BCC 57469
27458 INY
Sr746593 STA 113
Sr471 STr 114
Sr473 JSR 2 d’z207
Sv476 LDA #92
Sr473 LET 40
Srg4ga DEC 143
Sr432 BNE 57456
S7’434 RTS
BR=SIC-Furktion FENO
S7435 152 53 88 1
Sr’490 14 4a 177
S7495 ISR 0 4S171
27498 BMI 573595
Syrasad BNE 57534
SyYsg2 JI5SR 765523
rss ST} 34
sr9a7 STr 359
Sr229 LET #4
Sail LDA 34)
Sr7213 STR IR
57512 INY
srsiles LOA 34,
SyYs13 STA 1a
Sraoza LET #2
Srazz LDR 345 ,Y
SyYazd4 STR 33
SrYSs28 INT
Srazr LODA 243.7
ara293 STA 121
Srasl IMOoO al
SvY’524 LORA #129
Sroaes LOW 44
SYa333S JIZSR 4sa2d
5Sr’S4i LOR #141
sr243 LO #224
syads ISE 0 2 Jrsse
Sra4S LER #146
yrasa Lo 4224
Ssvrazz ISR 4dY’2or
Syaadn LOS 101
Syraar LOA 38
27359 STA ia1
Srzel ST 33
zrae2 LOS 29
ran LOA ac
ArZsr .STA 33
Svrasd STe 1a0
Srarı LOR 4a
Eräar”s STA 102
Syzro LOR Er
araärr STR 112
m
DM
Pceinter auf Koeffiziententsakelle auf
nzaechzstes Element setzen
>= FAÜ := Koeffizient + FRÜ
Zaehler fuer Foalvnomauswertung vermindern
alle Koeffizienten »errechnet? Nein: weitermachen ...
u 11879546
a 3. 927877’ r’4E-a3
“arzeichen van FAC prueten
weiter bei S7355
Nein: weiter kei 37534
Startadresse der IRR-CIA
nequatiı? Tas
Gleich Null”
=» TOBASE holt
Of+set-Pcinter setzen
Werte zus Timer A
sauje die Zehntel- und sanzen Sekunder
aus "Time OF Daw" nach FRC vekertraser
= yekersprirden Kiss W’I7T
ALU YR) ı= 133, Startadresse der letzten Zufallszahl
> 2139.20. .r143> nach FRAC vekertrasen
Acc tR) ı= 57455. Startadresse ven Konstante
=> FRC : netante # FRAC
= 57490. Startadresse von Konstante
Vorzeichen mcozsitijre machen
Expaoanenten
in Rundunasstelle hrimnsen
212
CO Er
+ = = Fe u u ee = U) 7 = = =
57573
BRSIC-Funkticn RND “Fartsetzung)
LDA
STA
JSR
LD*
LD'Y
IMP
#128
37
47319
#139
#0
43034
Ansprungadressen
37293
57595
57397
37399
Srsal
S76094
57805
57607
378099
Srelz
57615
Sr617
BASIC-Foautirne 575
en u L8
1
I
ZT ag hd dh
DU Be Be a EB a DE DET DE» DE A Bu Ba 2 Ba a DS ee ee
NEL EEE CHEN EN IN EN EN EA LA KA EN EN EN CN
ANA AIS AI
np en nn Be
CMP
BNE
ST'r
5T*
JMP
TAsS
BHE
LD<
JMP
ISR
BCS
RTS
LOR
#290
S768694
6
35
42595
357603
#30
42039
55498
37593
44426
4795
#223
1)
ca
Pa me 5
J
N]
7%)
zufalilszahl in Bereich von [ G:1 [ krinrgen
[Y
> FRC linkskuerdig machen
Accu YR? ı3= 139, Startadresse der letzten Zufallszahl
> FRC runden und nach “139,...,‚143> bringen
und Errorhandling der KERNRL-Rautinen und I170-Befehle
Accu = 249407?
Nein: weiter kei 37604
CXR/YR> als Paeinter auf Ende Arbeitsspeicher
«Pufferkereich fuer RS-Z32 UVebkertr agung schuetzen?
> CLR cahne CLALL
Fehlercode im Accu = 8?
Nein: Fehlermeldung ausweben, weiter kei 57609
Code fuer "BRERAK'"
= Fehlermeldung. READY.
> CHRQOUT, Zeichen auf aktiven Kanal ausgeben
Fehler” Iaı weiter kei 57593
>= CHRIN. Zeichen vom aktiven Kanal halen
Fehler?” Ja: weiter kei 57393
> CHKQOUT, Ausgakevcrkerei tungen
Fehler” Jar weiter bei 57593
> CHEIN,. Vorbereitungen fuer Datenempfansg
Fehler” Is: weiter kei 573593
>» GETIN. Zeichen von Tastatur in Accu
Fehler?” Ta: weiter kei 57593
>= FRME'"W/L.. FRHANLM
> GETREFR krinat SY75-Araument nach “209,’21>
Fuecksprungadresse (S7671 — 1> zuf Stack legen
ARaresse 133) entspricht dem Statusreasister
Dateruekeraabe-Farsmeter fuer 575 wor
L’Z0,.....7582) in die Reqister Accu, SF, TR bringen
lert aus Adresse 1753) ins Statusresister kringen
Rufruf der SY5-Rautine
Statysreqgister retten
Accu. AR. TR als Ergekrnisse der SYv3-Rautine
ujeder nach LVOE,. 0... r82) speichern
st=tusfla4=2 nach 275) bringen
213
Er
BASIC-Routine SAWE
57686 JSR
357639 LD*
57691 LDY
57693 LDRA
57695 JSR
576993 BCS
Srrea RTS
#43
65496
537593
> Parzmeter fuer 5AWYE lesen
Endadresse+1l fuer SAVE
Offset fuer 168-Bit-Pcinter zuf Startadres
> SAVE. speichern van Froarsmmen
Fehler?” Izas weiter kei 57397
BASIC-Routine LORD/VWERIFY
57781 LDA
S7703 BIT
57784 LDA
Sr v’a6 STA
57788 ISR
57711 LDA
57713 LD«
57715 LDY
57717 JSR
S7’728 BCS
s7722 LDA
57724 BEO
s7726 LDX
57728 JSR
57731 AND
57733 BNE
37735 LDA
57737 CMP
57739 BEQ
57741 LDA
57743 LDY
57745 JMP
57743 RTS
S7743 ISR
57752 AND
7754 BEO
s7756 LD%“
37758 IMP
S7’7’e1l LDA
57763 CMP
37765 BNE
577867 ST%«
57769 ST’Y
7771 LDR
57773 LDY
57775 JISR
57773 JMP
7781 JSR
57784 JISR
57787 JIMP
BASIC-Routine OPEN
7798 ISR
57793 JSR
37796 BCS
57798 RTS
#1
537748
4100
#163
43306
55463
#131
Ssvrel
#22
42037
123
#2
Ssv’8sı
42
46
#113
#163
+23306
42282
42538
42291
42615
7891
65472
579349
Einsprungag Fuer "ERIFY
Einsprung fuer LOAG:
entsprechendes Flas setzen
> Parameter fuer LOARD-/YERIFYF lesen
Flas fuer ’YVERIF'Y"
Zeiger auf Anfang des BASIC-Bereichs
fuer RApprend nach ı8RrrR> kringen
> LORD, Load und Yerifv von Proar ammen
Fehler? Ja: weiter bei 5730993
Verifv-F139
gesetzt? Nein: weiter kei
Code fuer "WYERIFY"
> REROST,. IvO-Status in Accu bringen
Bit 4 <Nichtuekereinstimmung? gesetzt?
s7’74
'D
Ja: Aussske "WVERIFYT ERROR", weiter bei 57
CHRGET-Pointer low «sollte wahl 123 “high
= 2? (Direktmadusakfrage, kei lou jedach
Jas RTS (sollte BNE sein)
Accw’YR) := 41828, Startadresse „on "Ok."
> Rusqaake der Meldung
> REACST. I/O-Status in Accu kringen
Bit fuer End or Identifv loeschen
sonstige Bits gesetzt? Nein: weiter hei I
Cade fuer "LORD"
> Ruszssgake Fehlermeldung, RERENY.
CHRGET-Pointer hiah
= 2 «Direktmodues)”?
Nein: weiter bei 77851
Zeiger auf Ende des Froaramıms setzer
‚Acc yYR) 3= 413465, 5Startzdresse von "RER
> Meldung susgehern
> CLR, Linkpcinter setzen. Einrgabewartesc
CHRGET-Pcinter ruechksetzen
Linkpointer setzen
RESTORE : Feset Descrirteorindex. Stack:
VYIWV
> Parameter fuer OPEN lesen
> OPEN, spezifiziertes File wetfnen
Fehler sauf@setreten?” 1a: weiter bei
214
- Zr SSE
se in (43443)
58
>» sein?
unsirmig>
rei
Cr. n
hleite
CONT sperren
Br
BRSIC-Rautinre CLOSE
7799
378892
Ss’sad
7807
378093
SI+ BH=S1Ic "zZ
JSR
LOA
JSR
BCC
JMP
Parameter
S/’s12
S5r’s1d4
579317
578193
97821
57324
7827
57338
37833
57336
378393
37948
37343
57946
57849
37854
57851
37853
537356
378593
57862
57865
57857
57868
57369
7878
37873
37876
357878
LDA
ISR
LD*
LO
JISR
ISR
ISR
ISR
ISR
LO
sT#
ISR
JSR
’SR
TA
TAr
LD«
JMP
’SR
JMP
ISR
EBENE
PLA
PLA
RTS
JSR
JSR
BNE
JMP
Parameter
57881
57383
373936
57889
37892
37874
537835
57897
37893
57902
57995
579983
57918
57912
57914
57916
57918
57919
LDA
JSR
JSR
ISR
ST“
TARA
LD«
LDY
JISR
JSR
JSR
ST»
LD'Y
LDA
CPA
BCC
DEY
JSR
fuer
fuer
44797
121
7869
44303
40
52469
7373
4rans
"3
#1
4a
85466
37962
373585
r4
40
73
#3
57313
659455
"LORD”,.
“OPEN”
>» Parameter fuer CLUOSE lesen
Filenunmmer in
-,
.
BR
Laerae Filename
-
.
-
CLOSE. File
Fehler aufgetreten” Nein:
1.QO-Fehlerkehandlunreg
"SAYE”
und
SETNAH,
Festsetzung Farzmeter fuer :Filename
Ersatzparameter fuer Primseradresse
Selamndaer adresse
"YERIFYT
Accu krirgen
Nummer im
lesen
Acecu)
RTS
‘Erzatzwert
Ersatzpzar ameter fuer
Festzetzunga P=zrameter fuer
v 1, DR u 1
SETLFS.
zurueck
Filenamen
zurueck:
naechsten
zum
zum
Pzrasmeter
Ersatzesr ameter fuer
SETLFS.
zurueck
=
hliessen
uekergecardgrneten Rautine.
lesen
uekersecrdreten Rautine,
OPEH
falls
falls
-Geraetenummer)> lesen
Selzundser adresse
Festsetzung Farameter fuer PEN
zum
naechsten Farameter
Ger aetenummer
sonst Ruecksprung zur uekersecardneten Reautine
> CHECOM pruett.
SETLFS. Fests
ygekergecordneten Rautirne .
Sekiundsaer acresse )
falls
etzung Parzmeter Tuer OPEN
rrueft zuf Komma und Nichttrernzeichen
GETBEYT liest Z=ehl ins R
Trennzeichen?” Neins RTS
ok Ko
> CHRGOT halt letztes
Trennzeichen”?
-
>
nd
urıd
Laermge Filensme als
"SYHTAH
"CLOSE”
> SETHNAM.
-
„
‚
Filenummer-
Ersatzpar ameter
pruett
Hein:
ERROR"
lesen
zeic
hen
cms Foalat
zZeic
RT
her
Ersatzprar ameter
Recorder >
Trernzeichen
Trernzeichen
Trennzeichen
lesen
Festsetzung Ferameter fuer Fiılenzmer
auF Komma und Nicht-Endezeichen
> GETET liest Filenummer
in
Accu krinaen
inz
Ar
fuer Ger zetenummer ÜFKe
Sekundaer adresse
Ersatzparameter fuer
-
„’
-,
.,
„
7
Erszsatzrar ameter
SETLFS
‚r
Festsetzung Far ameter
zurueck zur
naechster
Par zmeter
Tuer
fyer
uekersecndneter, Rautine.
. Ger zeterufmimer >
eingeaeherne Filenummer
Ger seterummer kleiner
Ja:
>
SETLFS.
weiter hei
Ersatzyar ameter
37919
fuer Selkaundzer:
Festsetzung Par
215
ar
Sselaundseradr
=.ch-
zymetenr Hı
22
e22©
Je
DPF
r
a+mon
a ı)
If
_ 10
in Ru
Re
AT
t
1
Edate)
- OPEH
: Trennzeichen
(Bi &S57+ BrHzIc zZ - - - - - - De re
Parsmeter fuer ”’OPEN” und "CLOSE” lesen “Fortsetzung?
7922 ISR 57962 > zurusck zur uekeraecrdneten Rautirne, falls Trennzeichen
57925 JISR 378586 > naechsten Parameter (Sekundseradresse) lesen
Ssr’928 TARA
7929 TAT Sekundsaeradresse ins "TR
5rY339 LD&S v4 Geraetenummer in #R
SY932 LDOA 2 Filenummer in Accu
573934 ISR 9 65456 > SETLFS. Festsetzung Pzrameter fuer OFEN
Ss7937 ISR 578682 >= zurueck zur uebersweordneten Routine, falls Trennzeichen
57940 ISR 578978 > prueft auf Komma und Nicht-Endezeichen
SY943 ISR 0 44d4ds = FRMEY/L. Auswertung von ARusdruecken
SY9d46& ISR 46755 >= FRESTR, prueft. ak Stringvariskle: Str inwerwal tung
7349 LDE 34 Sstartadresse des Filenzmens “Laenge im Accu)
7951 LDY X te)
37953 IMP 65453 > SETNAM. Festsetzung Parameter fuer Filenzmern
BERSIC-Funktiaon COS
Sr aaa LOA 4224 Acc RR) = Ssase,. Startadresse van PILZ
s7358 LDY 4226 j
Srg9sda TSR 2 JYrzar > FAC := Kanstante + FRC
BA=ICL-Funktion SIMN
SY7953 ISR 2 4dö1da = FRC nach REG vekertrasen
=r985 LDA #223 Acc tR) = 530935. Startadresse von 2#Pl. Periodenlisaenge
57358 LDY #226
vrara LOS 11a “"orzeichen „ar ARG z1= Wert Fuer VYarzeichenverknuepfung
srv972 ISRB 473793 > FAC := FRC Konstante
S79732 JSR 43140 >= FRC nach REG uekertrasen
arY979 ISR 43332 > IHT. Nachkommastellen akschneiden
S7Y981 LOA #0
79333 STA 111 lert fuer Yarzeicherwerkrueprtfung
7335 ISR 47137 >= FAC = ARG - FRC “eraikt Nachkommastellen. Argument
unde in Wert inmerhalk des Hauptdefinitionskereichs
transformiert. FRC ernthaelt Wert geteilt durch 2Z#PI>
SYI3SS LDOA #234 .AccuYR) = ISa9G, Startadresse san G.25
Sr 32a LDY #225
217,332 ISR 47134 = FRC = Konstante — FRAC
7335 LOR 102 ‘erzeichen san FRC
avr39T7 FHA
r79395 BFL 2 58013 pce=ziti.? ITas weiter kei I5013
ssaada ISE 47177 > FAC := R.5 + FRAC
=saa3 LER 1a2 “Vorzeichen van FRÜ
ssaas EMI Ssals nesatin,? Ja: weiter bei 35416
sag” LOA 18 Fl=a4 fuer Yarzeichen invertieren
2aa9 EOF 4252
=g2@11 STA 15
ssal3 ITSRE 49076 > FRC := -FrHü
Sgals LOA #234 Accu VR) := Saga, Startadresse vn 9,25
ssal=2 LO 4225
Sagze ISR drz2ar7 >= FRÜ := kKanstante + FRHC
ade FLR
=omz4 BF 0259029
adzs I5SR 49078 > FRÜ := -FHAC
ae OR 4239 Acc R) 3= 58095, Startsdresse fuer Palvnomauswertung
24331 1.6 #225
af? IM oO Sri! > Falvrncamauswertung
216
C- Pr sS:—+ FRrRSIcl Vz Pr = = Pe = ö ISO 23€
BASIC-Funktiaon TAN
5839036 JSR d4sa7d > FRAC nach (87.....91> krinser
58033 LDA #0
ssagiı STR 18 “orzeichenflag3 auf positiv setzen
58043 JISR 357963 > SIN
58046 LDX #78 .xPBVR) = 78
58843 LDY #4
53054 ISR 57594 > FRC runden und nach {78....,82) bringen
58053 LDA #87 EXRetTE) ı= 37
53055 LDY #0
53057 ISR 48034 >= X87 2... .91> nach FAC khrinsenr
58088 LDA #4 |
58962 STA 1a2 Vorzeichen van FRAC
ssa864 LDA 18 YMorzeichenflas in Accu
53066 ISR 38076 > FARC s= cos (FRC>
58089 LDRA #783
535071 LDY #0
ssa73 IMP 47887 > FRC s= KL TE.....823 7 FRC
s8907& PHR
598877 IMP 59413
Konstanten fuer triaconametrische Funktionen
ssa898 129 73 15 213 182 1.570793633 PI.’2
ssasS 131 v3 15 218 1852 &.28318531 PIxz2
53092 127 a a [e) Ic .e3
58495 5 Polvnamarad
583096 132 234 Z& 45 27 -14. 2313947
58101 134 408 vr’ 251 248 42. aa 7a 71
ss1a& 135 153 194 137 1 -75. 7041703
ssı1l1l 135 359 33 223 225 81.8052237
ssille 134 1655 93 231 48 -41.341 7021
58121 1351 73 15 218 182 &.23318531 PI#2
BRSIC-Funktion von
Ssslz& LDA
53128 PHR
58129 BPL
58131 JSR
58134 LDA
381365 PHRA
58137 CMP
581397 BCC
58141 LDR
53143 LD'Y
58145 ISR
58143 LDA
5815a LDY
58152 ISR
58155 PLA
58156 CHP
581593 BCC
ssisa LOR
531862 LDY
581654 ISR
581867 PLA
58168 BPL
5s1r78 TMP
58173 RTS
102
8134
4975
37
#123
Ss8148
#188
#195
47937
#62
#227
Svq4il
4129
59167
ATH
Yarzeichen van FRC
pasiti? Nein: weiter bei 38134
= FRC -FRi.
Expanmentkute von FAC
FAC kleiner 17
weiter bei 8148
"Acc tR) = 4yYS4S, Startadresse
Ja:
.cH 1
= FRÜC :
N = 1 “
Accu TR)
FRC
=ss174. Startzdresse fuer Pol nomauswer tur
> FPalvrcmauswertung
Araument kleiner 1?
Jar weiter kei 73167
Accu R) = SSasa,. Startadreszse van FI-2
> FRAU = Kanstante —- FRC
VYarzeichen des Arauments
positiw” Ia: FT:
>= FRAÜl s= -FRC
217
Ce S©S:4 BHS5SIc WwzZ - - - - - - 53174
Konstanten fuer ATN
ss1rg4 11 Polynomar ad
S817S5 118 179 131 1893 211 -65. 3479391 2E-R4 Koeffizienten
selsa 121 30 244 166 245 4.850942 16E-A3
58135 123 131 252 176 18 -9.01651117018
57813998 124 12 31 1093 202 a. 034209638
58195 124 222 83 203 193 -0. 05427913283
Ss294 125 za 1a 112 76 a.072457193653
ss205 125 133 234 981 122 -0. 0393023954
se21a 125 99 43 136 126 9.1109324123
598215 126 146 68 153 58 -9. 14233930483
Sse2zza 126 ve: 204 145 199 0.13999912
393225 127 ira 17a 170 193 -0. 333333316
s3230 129 a a a a 1
53235 ISR 65494 >= ELRCHN. aktive I’D-Kansele schliessen
532233 LODA 4a
3240 STA 19 Tsstatur als sktiven Eingabe-Kanal
53242 ISR 426518 > Descrirptorindex und Stack ruecksetzen; CONT sperren
s8245 CLI
as2d6 LOK #123 Code fuer Rusgake van "RERDY."
53248 JMP 768) Narmalwert .des Yektors (7687769): 58251
23251 TARA Fehlercade in Accu (S5Statusflags setzen?
53252 BMI 583257 Bit 7 gesetzt? Jar weiter bei 593257
8254 IMP 42042 > Ausgabe Fehlermetidung, Einraabewarteschleife
58257 IMP 42100 > Rusaake "RERDY.", Eiraakeusrteschleife
BASIC-Reset
egz8d JISR 58451 > Sprımngwektartakelle (768,...,rr9> initialisieren
53253 JSR 58303 > Yekteren etc. fuer BASIC initialisieren
926565 ISR 593402 > Rusasake Reset-Heldung
326589 LOS #251
Sss2r71 TXS Stackprcointer initialisieren
aa27Z BNE 358246 Inkedinater Sprung zur Rusaabe van "RERDY.", etc.
CHRGET-Routine (wird zusammen mit END-Wert nach “113-.....1943> kopiert)
Zenra-Flas4 ist gesetzt. falls Trennzeichen «A oder 593> gelesen wurde
Carrv ist gelcescht. Falls Ziffer (423 bis 37) gelesen wurde
58274 INC 122 CHRGET-Fointer lou erhoehen
Sg276 BNE 78284
sszr2 INC 1223 CHRGET-Pcinter high erhoehen
aszaa LDA Saar hier steht die zu kearkeitende Adresse fuer BASIC
2S232 CHP #32 gelesener Wert > 57 “keine Zahl»?
29285 BCS / 5393297 Ja: RTS
33237 CHP #232 Leercode”
22253 BED Sad . Jas naechstes Zeichen lesen
22231 SEC
REIHE SBE #43 setzt Larrv. falls Code {I 43
=3234 SEC
2295 SBE #20Q
332937 RTS
Aufzllsrzahl Fuer FHl sach dem Einschalten
218
En 4 PFRS>Ic zZ - - - - - - ame — a 7 Be |
Sprunswel:taren. Fointer und anderes fuer BRSIC initialisieren
s834a3 LOA #7& Code fuer IMP in
ss3aS STAR 34 Yektor fuer Ruswertung von Funktionen,
53397 STA ra4 Yektcaer fuer BERSIC-Funktion LSR bringen
5310 LDA #72 Accu TRI = 45840, Ausaabke von "ILLEGAL QURNTITY ERROR"
58312 LD’Tr #178
s32314 STAR 785 als Kennzeichnung fuer nichtdefinierte USR-Funktion
58317 STY 736
ss32@ LDA 4149 Accu RR) ı= 453969, Startadresse fuer INTFLP
53322 LDY #179
se324 STA 5 in Yektor fuer INTFLF bringen
53326 ST’Yr &
s8328 LDA 4170 -Accu/TR)> := 45482. Startadresse fuer FLPINT,
58330 LDY #177
53332 STA 3 in Yektor fuer FLPINT kringer
538334 ST’ 4
SS336 LO% #23
s8333 LDA 753274 .% CHRGET und Zuf2llszahl fuer RND van 133274 ,...,98292)
53341 STA 115.8 nach £115S,...,.1943> bringen
58343 DE#
se344 BPL 333383
9323465 LDA #3
s82348 STA 82 Schrittweite fuer GARBEAGE COLLECT
SS354 LOA #4
s8352 STRA 104 .
S8354 STA 193 Tastatur als al:tiven Eingake-Kansal
s8358 STA 4 Brte hiah des Pcinters zuf letzten String
53353 LD% #1
sg38A STx sa3 Linkpcinter zum Einkau von Praourammzeilen
sge383 3TXS saS3 in BASIC-Bereich “nal. 42274)
s8366& LOK #25 Descriptorindex initialisieren
58363 STH 22
sesra SEC
3371 JSR 0 &5436 > MEMBOT, Lesen des Speicher anfangs
s33r74 STE 43 und nach £42”434>) kringen
sS376&6 STTr 4
58378 SEC
sa372 JISE 65433 > MEMTOP. Lesern des Speicherendes
s8332 ST SI nach 1.599656 3 bringen
58334 5T'Yr I5
s3386 5T# 1 nd als Strimnsapointer nach (517525 bringen
583353 S5TYr SZ
sF394a LO'Y 44 Code Null
S8392 TrA
s3393 STA DI SC u Zn in er=zte Stelle des Arkeitzsspeichers kringen
53235 INC +3 und Zeiger auf Antara BASIC um eins erhoehen
38397 EBENE Tadel
3339393 INC 44
s3401 RTS
Mus4ahke Reset-rPelcdurnga
eädaz LER +3 Feinter zuf Antara ERSIC-Bereich
344 LO 34
aaa ISR 4139 > Te=st. ch serua Platz im Arbeitsspeicher
sa4a3 LORA #11% "Accu R) 3= 58423, Startadreszse van "COMMODORE 84 „.."
5411 LOW #222
s541> I5R 0 J4aacs = Meldung zues4eken
s241r LOR bake Pointer zuf Ende des Arkeitzspeichers
7413 SEC
24193 SEC +2 minus Fointer zuf Besinn des Arkeitsspeichers
=e4-r Tre
219
CeEn 54 BRSIC
Rusaske Reset-Neldurg
32422
293424
93426
38429
59431
58433
38436
LODA
SBC
JSR
LDR
LDY
JSR
JMP
et
44
48589
#96
4228
4238096
425654
Naormalwerte der
533439
5a441
58443
38445
59447
33449
58451
593453
53456
53459
53468
39452
53463
Sss454
398477
58433
33494
33547
s8521
59531
333408
S9I41
SSI342
58545
5935485
9547
39549
S335g
I853E
33539
59591
58592
59594
59596
59597
58599
58601
53643
3504
5s614
139
131
124
26
228
134
LDS
LORA
Vektceren van
227 53251
154 42113
165 ° 42364
167 42773
167 42980
174 44675
#11
53439 .9
,68.8
33453
[ST Ss re Er = c
Ss2 6869 69
13 32 32
‚3 777
85 83 73
32 54 52
8s3 83 934
85481
ISIS
iva 17a 170
ira ıiva 17a
33281
2433.
#2
145
3803
161
39594
38 688 25
5 209 =
Be — In ee
Fortsetzung?
ersikt Fnzahl freie Bvtes
> Zahl ausgeben
Accu ’R > S9d46ö4, Startadresse von "ERSIC BYTES „.."
> Meldung ausgeben
NELI
‚68 kis 779
fuer ERROR
fuer BASIC-Einuvskeschleife nach
fuer Umwandlung in Tokens
Yeltar fuer Rusgakbe „an Tokens KLIST>
Yektar fuer Interpreterschleife
Auswertung von Rusdruecken {FRMEVYL>
Yel:taoar
Vektor
VYeltor
"RERD'Y."
Vektoren won (758... . ,.17179> initizelisieren
3 86 32 565 39 34 6869 93 32 BASIC BYTES
13 a FREE
s2 32 42 42 42 42 32 BE Fo
‚9 683 79 82 89 32 54 S52 32 COMMODORE &4
67 32 8 Sa 32 42 42 42 42 13 BASIC Ya Brk
‚Ss 32 82 85 77’ 22 ed4k RAM
9 Tr’ 32 32 a SYSTEM
Rcecu merker
> CHEKOLIT. Rusyakeuvaorkereitungen
eventuellen Fehlercade ins #R
Hccu wiederherstellen
Fehler?” Nein: FRTS
Fehlercode wiederherstellen
ira ıiva ıiva Ivyva 1va 17a
iva Ira iva I\vya Ira 1ra
Backarcund-CLolcor al: Farkwert
der Cursorpositioan speicherrn
Accu + Carrv + Do 4 2565." 650 Sekunden warten
Flaa fuer diverse Tasten in "FR kringen
Taste vedrueckt?
Ja: RT=S
zeit „orkej ”
Nein: warten .„..
2 ir 232 13 112 12 Tinerkonstantentskelle fuer Ffi
Sa 1 174 a 1an {8} „al. Baal +. BIEIS FF
CErI 2 BShHhsliIc "zZ = = = = en
IOBASE, Webkergake der Startadresse der IRÜ-CIR in SKRTR>
59624 LD# 40 sFr E> ı= Sb3za
ss625 LDY #220
58628 RTS
SCREEN. Uekeraske des Bildschirmformats ir
33529
23631
39633
PLOT.
59634
3636
39638
s9644
33643
336453
53647
N ed 2
LDS #440
LDY #23
RTS
Lesen und Setzen der Cursarprcsition
BCS SF85423 Carrv vesetzt? Ia:ı weiter kei 58643
STA 214 Cursarzeile-
sTr zii Cursorspalte setzen
JISR 58732 > zugehcoserige Zeilenparsmeter =ktuzlisieren
LO“ ld Cursorzeile-
LO'Y 211 Lursorspalte lesen
RTS
Screen-Editar-Reset
536483
539651
336853
I98JI6
38633
S3664
59653
3669
39668
53674
293673
IS678
93678
9681
59533
39635
95939
III
58692
58695
58597
58598
ssraa
seral
58793
sgra4
S87a5
SSrag
53799
sg71a
ss712
59714
58716
58718
53728
58723
53724
initizslisieren
freimekesr
krinsen
al= Einfach-
sezschehern
JISR 337934 >= aktive 1Tr’ü-Kanzele und Yideo-Chip
LOA #0
STA a Fa CBM-Taste ikKleinschrift/’Graphik-Umschaltung>
sTA 2a Lursaor in QDunkelrhase
LDA #72
sta 555 EI = ale, Vektor fuer Tastaturakfrause
LDA 4235
STR [ta 1-1
LOA #14
STA &49 Maximale Groesse des Tastaturpufters
STR 852 Zaehler fuer Anspruchszeit van REPERT
LODA #14
sTtA ed4E Mamentaner Curszsortarkwert
LDA #4
STR 551 Zaehler tuer Miederhalungszeit van FREFERT
LDA #12
STR 20° Z=aehler fuer Cursarkblinkdauer
STR za4 Lursor ausschalten
LOR E48 CLEAR SCREEN. Bildschirm loeschen
IRA #123 Start=acdresse HKHiah desz Eildschirms
TAY Bit ” setzen "Eintfachzei lenkennzeichruna?
LOA #4
TAxs
STTr e1lr.® in T=kelle fuer MSE (Dcoppelzeilentakelle:
CLC
ADC 4404 zZeilenlaen4e addieren
BCl. 337093 liebertr=247 Nein: MSB nicht erhoehen
IN'Y
IN“
CP“ #25 alle 25 Zeilen iriti=alisiert?
BNE 53701 Hein: weitermachen ...
LDA #255 zsallte wohl Kennzeichrmng der "25. Zeile”
sTA 217. zeile sein. ist jedach bereits „arher wesc
LOX #24 Bildschirm loeschen
JSR 59943 Zeile (Hummer im KR) lcoeschen
DEXx
BPL 358724
221
CE 54 BRS>SIC WzZ - - - - - -
Fa’ 25
HOME. Cursor in linke obere Ecke
S857285 LDY ya
3728 STYr il Lursorspalte :ı= B
393734 ST'r 214 Cursorzeile := 8
Zeilenparsmeter sktualisieren
33732 LDX 214 Cursorzeile ins XR
58734 LDA ei1i Cursorspalte in Accu
3736 LDY e1lV’,® MSB=z fuer Doppelzeilen
58738 BMI 58748 Einfachzeile? Ja: weiter kei 583748
Ssr4a CLC
55741 RDC #440 Lursorspalte um J@ erhoehen
58743 STR il
S98745 DES um eine Zeile zurueckgehen
3746 BPL 33736 und weiter zugehneriae Startzeile der Doppelzeile suchen
38748 LDA e17.8 209.210) auf erstes Zeichen der Cursorzeile setzen
55750 AND #3
53752 ORA E45
38753 5TRA 21m hiah
53757 LOAR 864556 .% Takelle der LSBs fuer Bildschirm
Ss7eA STA za low
58782 LDA #39 Zejlenlzenae fuer Rintfachzeile
sS7&4 INS
37653 LDY 1”. Eintachzeile?
=S787 BMI 393775 Ja: Zeilenlasenge speichern, RTS
5376893 CLC
sevvra ADC #40 49 =ddieren
Ss772 INS eine Zeile vorgehen
Se7r723 BFL 58765 amd weiter n=ch letzter Zeile der [Ucppelzeile suchen
58775 5TRA 213 Zeilenlsaenge speichern
SSYTYT7 RTS
aaryYS8 JSR 55734 > aktive Irü-Kanaele und Yideo-Chip iritialisieren
53731 IMF 53726 > HOME
28734 LDA #73 aktiven RAusasabe-kKanal
s378E STR 154 auf Bildschirm setzen
SEr73=8 LDR #6 akti.en Einasabe-kanal
sera STA 133 auf T=a=st3atur setzen
S732 LOx* #447
53794 LOR Sasaa,H
sr” STA 532947.% Fesister des Yideo-Contrallers setzen
sasaa DEE
see] BNE 35794
S335RA3 RTS
=
yı
in
tatunrmufter abkhzuer
sed I_LDıY rl erste=z Zeichen de=z Kevbcaardbuffer=z
sgSa7 LOK 44
32303 \.DA BIz.M Zeichen in Keukoardkuftfer
e3l2 >STA E21.5 um ejnmz Stelle nach unten verschieken
22315 INS
ga1e CF 198 kis alle weltisen Zeichen erreicht
SFR EHE 78503
ar DET 138 Zaehler fuer Anzahl Zeichen um eins vermindern
ade Ti Accu enthaelt mn Zeichen aus Tastaturpuffers
Zes2.ı: CI
Aagrd LLC
nt. 25 FT
222
CB 84 BRSTIC
ne L_ [3 2 [ } mu =
5332&
Marteschleife Fuer CHRIN
28826
39329
39831.
38333
593336
33333
39339
592341
399343
39345
ISS4E
kat = Tate 5)
59352
ket= the te
39359
ISA
393682
S364
583653
58367
s3F7a
393373
sg74
33376
33378
JH334
Zeichenuekerrnahnme ch
589332
53594
23338
SSSIE
39894
93532
39393
N
AU
ei
eb
DM Be Ba A Ba Er, BR BA BE
wa
SR
LOR
STA
STA
BEO
SEI
LODA
BEQ
LOA.
LO“
LDY
ST'’r
ISR
ISR
CMP
BNE
LD«
sEI
sTt«
LOA
STA
DE“
EHE
BEQ
CHF
EBENE
LD'Y
STr
391538
19383
204
838
. 59329
207
59353
206
547
#0
207
39323
93344
#131
33578
#93
198
gsas4s,%
538.%
39967
53329
#13
33326
{N
u)
Dip Pa po Ra an Au
9 a a u ze «)
Wide Pe
=
> Ru=sgabe eines Zeichens auf den Bildschirm
Anzahl Zeichen im Tastaturpuffer
Cursor einfausschalten
Insert Enakle (bei Zeilenueberaanda neue Zeile einfuegen?
keine Zeichen im Tastaturpuffer? Ja: weiter warten
Interrupt verhindern
Cursor hell?
Neins weiter bei 53355
Zeichen unter Cursor
Farke unter Cursar
Cursor dunkel schalten
> Zeichen in Bildschirm-RAM bringen
> Zeichen aus Kevkasrdkuffer holen
Eode fuer "Shift-RUNSTOF"?
Neins weiter kei 53878
3 Zeichen in Tastaturpuffer krirgen
.LDOAD" CR "RUN" CR
RETURN? |
Neins zurueck zur Eingaskeschleitfe
Bildschirm
Lzenge der momentanen Zeile
Fla3 fuer "RETURN" setzen
Yom Ende her Zeichen vam Bildschirm lesen
gleich Space?
Nein: weiter kei 53395
Zaehler verminderr
und weitersuchen
Zaehler erhoehen und als
Zeiger hinter letztes Zeichen der Zeile speichern
Inzeert Disakle
‘kei Zeilenuebersang kein Einfuesen van Zeilen)
Lursorpceeition :ı= 8
Fla4 fuer Anfuehrungszeichen ruecksetzen
Lurseorzeile beim Aufruf »on CHRIN bereits durch
Scrolling verschwunden?” Ta: weiter kei 53938
uırscerzeile ins R
> Adresse fuer zugehoerisge Startzeile nach (209.2105
wurde waehrend der Einwabke die Anfznaszeile werlassen?
Jas ak erster 5palte der neuen Zeile lesen
Cursorspalte hei Rufruf „on CHRIN
in Lursaorspaltenpcointer bringen
mit Index fuer Anzahl gueltiger Zeichen vergleichen
Kleiner: Zeile zuswerten. weiter kei 793938
Goroesser ader qleich: Leere Eingake, weiter kei 393973
223
ul — 1 22 |
+ PeHnz=sıIc
IR ber,
— . = au = [0 [;
Einstieg fuer CHRIN „am Bildschirm
58934
589231
53932
58933
53934
SS9I38
58938
59940
53942
58944
53946
53948
Sg950
58952
53954
SSI3E
8958
28968
53962
3964
SSI6E
52969
8971
39973
38975
53977
533979
33981
589933
33985
339837
58939
Se391
593994
389965
383998
3333
598009
Sssoa1
59082
s>0a4
Spaa6&
59808
7010
S9all
Umschalter
Sol
ssa1d
Saale
33013
590208
saa22
saa24
TrPA
PHR
TARA
PHR
LOR
BEO
LDY
LOR
STR
AND
ASL
BIT
BPL
ORA
BCC
LD#
BNE
BVS
ORA
INC
JSR
CP'Y
ENE
LDA
STA
LDA
LOS
CP*s
BEQ
LD*S
CP»
BEQ
JSR
LDA
STR
PLA
TAs
PLA
TAY
LOA
CMP
BNE
LDR
CLC
RTS
CMP
BNE
LOR
EOR
STA
LORA
RTS
208
33329
e11l
20933 ,Y
215
#63
213
215
33994
#128
IS96H
e12
Sg964
se964
#54
2il
S9a12
280
33325
#0
2a8
#13
153
#3
58991
154
#23
53994
39158
#13
215
e17
#222
3010
#255
Indexresister retten
noch Zeichen vorhanden “Zeile nicht komplett gelesen)”
Neinss zurueck zur Warteschleitfe,. weiter kei 58329
Cursorspalte als Index ins TR
Zeichen vom Bildschirm lesen
vom Bildschirmceode in RSCIT umwandeln
Bit & im BSC gesetzt? Nein: weiter kei 53954
Bit 7 im Zeichencode setzen
BSC graesser 127 “Resers)>? Nein: weiter kei 539650
Fla4 fuer Anfuehrungszeichen ader Bit 5 im BSC Yesetzt?
Ja: weiter bei 339684
Bit & im Zeichencade setzen
Pointer fuer Lursaorspalte erhcehen
> Anfuehrunaszeichen pruefen. e.tl.
letztes Zeichen gelesen?
Neins weiter hei 53996
Qucate Modus setzen
Flau4 fuer "Zeile komplett gelesen" setzen
Code fuer "RETURN" als Kennzeichnung fuer Zeilenende
aktiver Eingaabe-Kanal
= Bildschirm”
Ja: weiter kei 598991
aktiver Rusgake-Kanal
= Bildschirm”?
Ja: weiter kei 593994
>= Zeichen zuf Bildschirm aussehen
Code fuer "RETURN"
in Register fuer letztes Zeichen krinaen
Indexresister „cam Stack halen
gelezsenes Zeichen „aleich Jem
RSCII fuer PI?
Nein: tertiy
ASCII fuer FI durch BASIC-Token fuer FI ersetzen
fuer Quote-Madus
#24
bar 1 Pen
212
#1
212
#234
Code fuer Anfuehrmungaszeichen?”
Nein: FTS
Fl293 fuer YBucote-Madus imvertieren
Code fuer Antfuehrungszeichen wiederherstellen
224
C-BS5r ©&©+ BEHRSIc W2Z - - - - - - Ze:
Zeichenausgabe skschliessen “mehrere verschiedene Einspruenge)
39925
59927
592293
59931
59a33
59035
59437
590939
59842
59045
59948
59949
5390568
59052
59854
S59056E
39057
599583
59959
59068
59861
Cursor weiterkewesaen ,.
59862
390965
59067
590693
59971
59473
59975
59077
59080
59982
590835
59987
59089
590891
59094
IIAIE
39993
59199
593182
59193
59105
59187
591089
59118
59112
59113
59115
59117
59119
59121
59122
59124
ORR
LD<
BEO
ORA
LD<
BEN
DEC
LDA
JSR
JSR
PLA
TA’Y
LDA
BEO
LSR
PLA
TAX
PLA
CLC
CLI
RTS
JSR
INC
LDA
CHMP
BCS
CMP
BEO
LDRA
#64
199
SAA33
#123
eil6
520393
216
546 .
539323
S99652
elle
S9O5E
el2
9127
658
>9a35
59751
214
#23
S9a98
9625
214
Bit & im Zeichencode setzen
Flaas fuer RYS-Madus wesetzt?
Nein: weiter bei 59433
ansonsten Bit 7” (Revers, im Zeichencade setzen
Insertzaehler
= 8? Ja: weiter bei 596393
Insertzaehler »erminderr
sktueller Farbcode ins XR
> Zeichen und Farke ausgehen
Ly
> Cursor weiterbeuegen
YR wiederherstellen
Insertzaehler
= 8? Ja: weiter hei I945€
ansonsten Qucote-Modus ausschalten
*R und Rccu wiederherstellen
bei Bedarf nzaechste Zeile initialisieren
> zeilenpointer erhashen. falls Cursor in letzter Spalte
CLurscarspaltenrcinter erhoehen
aktuelle Zeilenlaenge 33 ader 73)
mit Cursorspalte Vveraleicher
letzte Spalte yekerschritten?” Hein: RTS
kereit=z Doppelzeile”
Jas weiter kei 39127
Zeilenuekeraana: erfalate die Aussake des Zeichens
im Editiermadus? Nein: weiter kei 734537
> Foartsetzunazeile einfuesen. Rest nach unten »verzchiekern
Lursorzeile
kleiner ZI”
Ja: weiter hei 9093
> SCROLL. Bildschirminh=alt nach cben verschieken
Lursorzeilenpointer vermindern
Zeile ihHummer im #R> als Fartsetzungszeile markieren
Folaezeile =al=z Startzeile markieren
al. tuelle Zeilenlaenge
um J@ erhoehen
Doppelzeile”
Nein: weiter kei 53124
Index »verminder-r
weiter zugehoerige Startzeile der ODcoppelzeile suchen
-
> Startadresse lau, Hiah der Staertzeile setzen
225
ud — I 20 |
+ PEHSIc
Bewegung aus Doppelzeile heraus. neue Zeile initialisieren
53127
591293
S9132
59134
59138
Rueckschritt in nicht
39137
29143
DEC
J5SR
LOR
STA
RTS
214
97316
#0
e11
Cyursorzeile vermindern
> Zeile initialisieren
Spalterpcinter ruecksetzen
zum aktuellen Cursarzeile gyehserige Zeile
Zeijlenpainter
= 7? Nein: weiter bei 39147
Spalterkaeinter auf erste Spalte setzen
Ruecksprungadresse „om Stack halen
Inkeadinater Sprung zum Akschluss der Zeichenzausgabe
zZeilenpointer vermindern
> Zeilenparsmeter aktualisieren
_zenae der Zeile. in die Cursor keweq4t wurde
als Cursorspslte speichern (letzte Spalte der Zeile)
Rusagake eines Zeichens zuf Bildschirm
391583
317
Sa1l6l
=a1a2
52153
9154
9159
S>3167
2169
Sso1rl
Ssoa173
S9175
2172
9134
S91SE
31953
Sa19r
TI1ISI
3131
S2133
23135
13T
33139
SIzdz
„9207
u Per 5 Di
mb 5 5
ka Ber
=3z21ld
TREE
Pe
23213
NFEEE
FHR
STA
TARA
PHR
TrA
PHR
LDR
STA
LO
LODA
BRL
IHMP
LMP
EHE
IMP
cnP
BCE
CMP
BCC
AHO
EBENE
AHE:
ISFR
: IMF
Li
BEI
IMF
Ü.pF
ENE
TrA
EHE
ISR
TMP
213
EN
DPI A
Resister retten
[R-Flas ruecksetzen
Curzsorspalte ins "FR.
Zeichencaode in Accu kringer
Code kleiner 1237 Ja: weiter hei 597173
> Sshittzeicher hbearkeiter
"BETUFRN"?
Hein: weiter hei 59135
> Zeilemwarschukb, Flag ruecksetzen
Code Lleiner 32 (Steuerzades)”
Ja: weiter bei 53205
Code L:leiner 967
Jar keine Gr=pßhikzeichen, weiter kei 59197
Eit 7 loeschen. Umwandlung in Bildschirmeode
Inbedimater Sprung
Bit & und ” Joeschen. Umwandlung in Bildschirmceade
>= auf Anfuehrungszeichen pruefen
» Zeichenausaske akschliessen
Insertzaehler
=@? Ia: meiter kei Il
> Zeichenausaushbe =ahbschli
"DELETE"”
Heins weiter hei 79252
Anfarasspalte
=#? Nein: weiter bei 79229
> Rueckschritt im nicht zur Cursorzeile gehcerige Zeile
- Zeichen zu CGursarpcsition loeschen,. Abschluss
226
ne - - - - - - Ta127
c-Er1
+ 5H>Ic vw - - - - - =
59225
Rusaabe eines Zeichens auf Bildschirm (Fartsetzung?
59225
539228
39223
s9231
s9234
59233
39237
39238
ss24a
so241
39243
s9244
59246
s9247
59243
39251
59253
59255
39233
39268
WSWDI ID NND UND DPD MDMDMMPIIRIM
ASIATISCH
nNEDS SIND R SS SITES WR
Ic)
PA] BIP | BL PA] BSH, BCE | BE] BB BU BO] BR ı Ba Ba Bu,
FENDT EN SD AN BE werN
fd Ip if 1) .£ Ir) KM) in Ne) 'ıo I) ıyı ıD ıD Ne}
VE TEN IE EN ENTE
N
Gi ua ya PR RI Pi Pl ee ee u eb
1
JSR
DE'r
STY
ISR
INY
LOR
DEY
STA
INY
LDA
DEY
STA
INY
CPY
BNE
LDA
STA
LDA
STA
BPL
LD«
BEQ
JMP
CHP
BNE
sta
CMF
BNE
JSR
CMP
BNE
IN’Y
ISR
ST'r
DE'Y
CP'Y
Bil
DE”:
ISF
LO’
STr
IMP
cMP
BHE
[Lil
TraA
ROC
TAT
IHC
CMP
BCC
BED
DEC
SBC
Bi
STA
BHE
243).
2.243).
213
3234
#32
[N [h
'D Igı
IN PO ia
Letter Sm
Dead did
#40
{N in
N) If
{
An)
WIE Pa io ic pa fa
Deut DD m -
VDernDERrLuHh
ın
\ü
> Pruefung, ob Rueckschritt innerhalk von Doppelzeile
Cursorspaltenprointer vermindern
und als neuen Spalterpcinter speichern
> Color-Pcinter errechnen
Alle Zeichen „an Cursaorposition kis
Zeilenende um eine Stelle zurueckschieben
ebersc die Farkcodes
Endspalte erreicht?
Nein: weitermachen ...
letzte Position loeschen
aktueller Farbcode
ins Color-RRAM
im Narmalfall unkedingter Sprung
Insertzaehler
= 9? Ja: weiter kei 39269
> Zeichenausaske akschliessen
"REVYERS DON"?
Nein: weiter kei 39275
Resers-Fla4 setzen
"HOME"?
Nein: weiter hei 59282
Cursor in linke obere Ecke setzen
"ZURSOR RIGHT"?
Nein: weiter hei 59309
Spaltenrpcointer erhoehen
= Pruefung,. ck Cursor in letzter Spaltenporition
neuer Spaltenpointer
llekeryana im neue Zeile”
Nein: Abschluss Zeichenausgake
zeilenpcinter vermindern
zrneye Zeile initialisieren
Spaltenpointer
zuf erste Spalte setzen
>= Abschluss der Zeichenausgake
"CZURSOR DON"?
Nein: weiter kej 9342
Zeilenlaerme zum Spaltenpcinter addieren
Zeilenpcointer erhoehen
neue Zeile erreicht?
Hein: Schritt. innerh=lk von Dcppelzeile, weiter bei 59304
zeilenpcinter vermindern
Spaltenpcinter um da vermindern “Carry» bereits gesetzt)
kereits genug dder suktrashiert? Ja: weiter bei 79336
Wursarspaltenpaointer setzer
md ein weiteres Mal ...
227
Bud — I 02
Rusagake eines Zeichens auf Bildschirm “Fortsetzung )
39336
393339
39342
59345
ISR
IMP
ISR
IMP
375186
59943
59595
504834
> neue Zeile initialisieren
> Abschluss der Zeichenausaake
Contraolcodes fuer Farke pruefen
weitere Zeichencades bearbeiten
N ,} \!
Bearbeitung der Shiftzeichen
39348
39358
593352
39354
59356
59358
59368
S9363
59365
99387
59370
39372
sa374
39376
59378
393308
59332
397394
59386
5393388
39398
39392
59394
39397
33399
Ss94a2
39423
9405
S940E
2943
29409
S9411
59412
59414
59415
59417
573419
s9421
59423
S9425
39423
9430
53433
39435
39437
59439
9442
592444
AND
CHP
BNE
LDA
CMP
BCC
JMP
CMP
BNE
JMP
LD<
BNE
CMP
EBENE
LDY
LOA
CMP
EBENE
CPY
BNE
EP'Yr
BEOÜ
JSR
LD'Y
JSR
DE'Y
LOR
IN'Y
STR
DE'Y
LDA
IN'Y
STR
DE'Y
CPY
BNE
LDA
STA
LOA
STA
INC
JMP
LO
BEQ
ORRA
JMP
CMP
BNE
#127
4127
59356
#94
209) ,Y
#32
IZIA
#232
2997 ,'r
S45
2435 ,'r
ele
30483
216
52442
#64
saa31
#17
539468
Bit 7 loeschen
war es Code fuer PI”
Nein: weiter kei 19356
durch Bildschirmcode fuer PI ersetzen
Code im Bereich von
Ja: weiter hei 59363
> Zeichenzausgakbe abschliessen
Code fuer "Shift-RETURN'"
Nein: weiter kei 9370
> Zeilerwaorschuk. Fl232 ruecksetzer
Quote-Modus eingeschaltet?
Ja: weiter bei 39437
Code fuer "INSERT"?
Nein: weiter hei 594323
Zeilenlaenge
Zeichen lesen
“Mleich "SFACE"?
Nein: weiter kei 39394
Lursorpcezsition erreicht?
Nein :weiter kei 59397
Zeilenlaernge bereits 793 “Doppelzeile)>?
Jar Zeichenausgake =kschliessen
> Fortsetzunaszeile anfuegen
Zeilenlaendge
> Colaer-Peointer berechnen
zsaemtliche Zeichen vom Zeilenende Kiss zur
um eine Pasition nach rechts verschiehen
Farkocdes ekensc
Curscorpasiticon erreicht?”
Nein: vseitermachen ...
L-ursorpoasition lceschen
aktuellen Farkcocode
ins Coalar-FRAr
Insertz=aehler erhoehen
= Akschluss der Zeichenzusqgashe
Insertzaehler
= 9? Ja: weiter kei
Bit 8 setzen
> Zeichen ausgekern
59442
Code fuer "CURSOR LP"?
Nein: weiter hei 39465
228
125 kis 159 (Steuerzeichen??”?
Srzsorpcosition
c-Er1
= EensıIcl zZ - - m m - -
a $— = We En
Ausgabe eines Zeichens auf Bildschirm (Fortsetzung)
59446
59448
59459
9422
59454
59455
59457
LOS
BEQO
DEC
LDA
SEC
SBC
BCC
STAA
BPL
JSR
BNE
CMP
BNE
LDA
STA
CMP
BNE
TrA
BEOQ
ISR
& DEY
STYr
IMP
JISR
JMP
CMP
BHE
2 JSR
IMP
ÜPRR
ISR
JMPF
214
39505
214
211
#40
Ss3463
33137
=Fa4s
#19
39308
39592
390483
#128
53595
60495
Cursorzeile
= 0? Ia: Zeichenausgake akschliessen, weiter bei 59505
Cursorzeile vermindern
Cursorspalte
um Zeilenlaenge vermindern
Cursorkewegurga in Doppelzeile? Nein: weiter bei 59463
sonst neue Cursorspalte speichern
Inkedingater Sprung zum Rbschluss der Zeichenausgabe
> Zeilenparameter aktualisieren &
UInkedingter Sprung zum Abschluss der Zeichenausgabe
Code fuer "REYERS OFF"?
Nein: weiter kei S5947&
Resers-Flayg loeschen
Code fuer "CURSOR LEFT"?
Neins weiter hei 59498
mamentare Spalte = erste Spalte?
Ja: weiter kei 59492
> wenn Rueckschritt in Startzeile, Cursorzeile vermindern
Spaltenzaehler vermindern
und als neuen Spaltenpointer speichern
-
>= Ahschluss der Zeichenausgake
> Rueckschritt in nicht zur Cursarzeile gehoerige Zeile
-
> Abschluss der Zeichenausaakbe
Code fuer "CLEAR SCREEN"
Nein: weiter kei 39503
> Bildschirm loescher
> Abschluss der Zeichenausgake
Bit 7” setzen
> Cantrolcodes fuer Farke pruefen
> weitere Zeichencades akfraserı
Neue Zeile initizslisierer
a A
bau L ii
DT un Ba ı Ba En en
Ba En El u a BE | Ba FR En u u rer)
Fla4 fuer Cursorzeilerwechsel (v9l. 39911 FF?
Lursorzeilenpointer
um eins erhoehen
letzte Zeile erreicht?
Nein: weiter kei 9323
> SCROLL. Bildschirmirhalt nach oben verschieben
Fortzetzunuszeile”
Ja: mach eirmzal scrollen
neue Lursarzeile setzen
> Zeilenparameter aktualisieren
loeschen “Carrisge Return)
Insert-Zaehler lcescher
Revenr=-Fla4.
Yucte-Paocdus ruecksetzen
Cursor in erste Spalte =setzen
= rege Zeile initislisieren
> Rkszschluss der Zeichenzussabe
229
COEr
+ BerHzSlıIc vw - - - - - -
Pruefung.
III
ka he ber farben)
39557
39559
395651
293652
59564
539565
39387
39368
39570
LOX
LDA
CMP
BEO
CLC
RDC
DEX
BNE
RTS
DEC
RTS
Pruefung,.
59579
S9ISO
39582
39333
39585
59586
59588
59599
59592
59594
LD«
LDA
CMP
BEQ
CLC
ADC
DE*
BNE
RTS
LD®
CPX
BEQ
INC
RTS
#2
#0
211
23353
IR
#40
#2
#39
ck Rueckschritt von zweiter in erste Zeile einer Dcoppelzeile
maximale Anzahl zusammeruehcorisger Zeilen
Lursorspaälte = (Rcocu)?
Ja: weiter hei 59568
zeilenlaenge addierer
Cursorzeilenpointer vermindern
ok Cursor in letzter Spalte beim Bewesen des Cursars nach rechts)
maximale Anzahl zusammenhaengender Zeilen
Laense einer Einfachzeile
Cursorspalte mit Accu vergleichen
Gleich: weiter kei 59586
zeilenlaenge addieren
und ncach ein zweites Mal pruefen
Cursorzeilernpaointer
= 253?
Ja: RTS
sonst Cursorzeilenpointer erhoehen
Controlcodes fuer Farke pruefen
39595
59597
396g
S9602
39603
39605
9806
5392609
S9&10
29618
LDX #15 Anzahl mceqlicher Farken — 1
CHPUOCSSE1A,8 Steverzeichen mit Wert in Tabelle vergleichen
BEQ T9646 Gleich: Farke setzen. weiter hei S9IHBE
DEX*
BFL 59597
RTS
ST* ads Farbe setzen “in Adresse fuer aktuellen Farkeode>
RTS
144 5 28 15393 155 > 31 159 zugehceriae Tabelle der Farkcodes
1293 1493 158 151 152 153 154 155
SCRÜOLL. Bildschirminrhalt nach oben verschieken
5982E
596528
59629
5968231
59632
S9E34
596353
59837
59838
59640
sa9s42
59644
59647
LDA
PHR
LDA
PHR
LDA
PHR
LODR:
PHR
LD=
DEC
DEC
DEC
INS
1r2
12-17 uf Stack retten
KR als Zeilenzaehler initialisjeren
Lursarzeilenpcinter vermindern
Curscorzeilenpcinter (Rufruf van CHRIN. wal.
and Nummer der Fartsetzungszeile um eins vermindern
230
>>35TI2
ERIAT Ft)
er &I+ PBRS>SIC Vz z = = = = zu bee Bein
SCRÜLL, Bildschirminhalt nach «ben verschieken “Fartszsetzung>
59848 ISR 5398388 > Pceinter zuf Zeilenanfzng setzen
59651 CPX #24 szemtliche Zeiler »erschaben”
596833 BCS 539667 Ja: weiter kei 9667
59655 LDA 2 684557,8 Tabelle der LS5SE= der Zeilenanfaerge des Bildschirms
598583 STA 172 als Pointer low setzen
59654 LDA 213,#% Takelle fuer MSBs und Doppelzeilenkennzeichnung
59662 ISR 5983483 > Paeinter setzen. Zeile in varherise Zeile kopieren
59665 BMI 39647 Unkedinater Sprung
S9667 JSR 59903 > letzte Bildschirmzeile loeschenr
596870 LDX #40 MSB= und Doppelzeilenkennzeichrnung verschieben
59672 LOA 217.8
59674 AND #127
59676 LDY 218,®
593673 BPL 396532
5968A ORA #128
598682 STA 217,xX
59884 INX
59685 CPX #24
59687 BNE 359672
59689 LDA 241 reue Zeile 2m unteren Ende
59691 ORA #128 als Einfachzeile kennzeichnen
59693 STA 241
5968595 LDA e1Yy Ist ckerste Zeile eine Fortsetzungszeile”?
59697 BPL 59838 Ja: noch einm=l scrallen
596899 INC 214 Cursaorzeilenrrointer erhoehen
59781 INC &77 Nummer der Fortsetzungzeile um einz erhoehen
59704 LDA #127
Ss970& STA 56320 Row-Select fuer Tast=aturakfrage
59709 LDA 56321 Columm-Select fuer Tastaturakbfr aue
s9712 CMF 4251 Lantrol-Taste sedrueckt”
59714 PHP
59715 LDA #127
59717 sta 56320
s97’20 PLP
s9721 BNE 59734 Nein: weiter hei 393734
59723 LDY +0 Yerzoeserunasschleife
59725 NOP
59726 DEX
59727 BNE 59723
59729 DEY
59730 BNE 359725
59732 ST'Y 193 Tastaturpuffer lcoeschern
59734 LDA 214 Cursorzeilenpcinter ins #R
39736 PLA 1lVYZ2,r.2....179> wiederherstellen
59737 STRA 175
59739 PLA
59740 STA 174
59742 PLA
59743 STA 173
59745 PLA
59746 STA 172
59748 RTS
231
CE 2:4 EHRSICc zZ - - - - = - =>2749
Fortsetzungszeile anfuegen
23749 LDX zid4 CLursorzeilenpcinter
59751 INS
S9aVY SZ LOA elvr.® sehcert Zeile unter Cursaorzeile bereits zur Cursorzeile
S9754 BPL 59751 Ja: nzaechste nichtzugehcerige Zeile suchen
397585 ST* 877 Hummer der zanzufuesernden Zeile
53753 CPX #24 kleiner ader aleich 24 “alsca nach im Bildschirm)?
59761 BEQ 39777
aar7623 BCC 59777 Ja: weiter kei 39777
S97683 IJISR 596826 > SCROLL, Bildschirminh=lt nach oben »verschiehen
297858 LDXS ya Nummer der znzufuesenden Zeil®e
59771 DES um eins vermindern
Ssorr72 DEC 214 _ ebenzca Curscarzeilenpcinter
sar’r74 IMP 594093 > Fortsetzungszeile initialisieren
23777 LOR 172 1lYZreası 179) auf Stack retten
39773 PHA
9780 LOR 1723
9782 PHRA
39733 LOA 174
297853 PHA
9735 LDA 175
Har38 PHA
937393 LDES #25 “AR als Zeilenzaehler initialisrieren
s9731 DE#X
sa79z2 ISR 539839383 > Zeilenpointer (209.214) setzen
53795 CP% ya kereits alle Zeilen bis Lursaorzeile verschaken?
Ss3798 BCC 2 59814
g9gaa BEQ 59814 Ja: weiter bei 399314
Soga2 LDOR 2 569599.% Tabelle der LSB= der Zeilenanfzenge
92305 5TA 172 alz Pointer law setzen
9347 LOA 218.8 Takelle der MSBe und Doppelzeilenkennzeichnung
„32093 ISR 539948 = Zeileninhalt um eine Zeile nach unten kopieren
SaS12 BMI 59731 Inkedinater Sprurs
299514 ISR 059943 > eirsefueate Zeile loeschen
9817 LO8 #223 Tabelle der MNSEs verschieken
s33313 CP Br y kereitz alles Vverschaoken?
S33zz BCE 725398393 Ja: weiter hei 73539
SaS24 LDR eiS,.H Tzbelle der MSBs und Doppelzeilenkennzeichrus
SaszE AND #127 nach "unten” verschieken
293522 1DYV 217.8
9330 BPL 59334
S3S32 ORRA #128
93234 STA 213.8
9338 DES
9237 EHE 59819 weiter kei 533193
9333 LE# Sr Nummer der einsefueaten Zeile
2a9ade ITSR 70599 > Zeile als [lorpelzeile markieren und initislisieren
39347 TMP 5373€E >= £« 1lVY2,....172> wjederherstellen
232
CP S5SI4 BHZSIC WwZ - - - - - - 52342
Zeile in andere Zeile kopieren “fuer SCROLL und ”Zeile einfuegen”)
59848 AND #3 Adresse hiah der Zeile
s93358 ORA 848 "berechnen”
s9853 STR 173 und als Pcinter hiah speichern
59855 JSR 59872 > Transferpointer in Color-RAM berechnen
53858 LDY #39
s9858 LDA <1723,Y Zeileninhalt Zeichen fuer Zeichen
59862 STRA 209) ,Y in neue Zeile verschieken
s9364 LDA 1745, ekensoa die Farkcodes
59866 STA 24375 ,Y
s93&8 DEY alle dü Zeichen verschaken?
593659 BPL 5236508 Nein: weitermachen ...
593871 RTS
Pointer in Colcr-RAM kerechner
s9372 JSR 59940 > Pointer in Color-RAM berechnen
s98575 LDA 172 Trarnsferpceinter fuer Quellzeile in Colorpointer
59877 STR 174 fuer Quellbereich umwandeln
s9879 LDA 173
59881 AND #3 Bitz a und 1 isolieren
s9883 ORR #216 21S * 256 = 55296, Startadresse des Color-Nybble-RAMs
59935 STA 175
59337 RTS
Pointer in <2a9’210> auf Zeile “Nummer im KR) setzen
S99338 LDA 2 60856,% Tabelle der LSBs der Zeilenanfaenge
53891 STA 249 Pceinter law
59893 LDA 217,8 Tabelle der MSBs=s und Doppelzeilenkennzeichnung
59895 AND #3 Bits a und 1 isolieren
59897 DORA 848 Startpasition hiah des Bildschirm-RAMs
sa9aA STA 21a eraikt Pointer hiah
593892 RTS
Zeile loeschen
ss9a3 LO'Y #39 Lsenge der Zeile — 1
593905 ISR 59338 = Zeilenpcinter 209.210) setzen
s9908 ISR 9940 > Pointer in Color-RAM kerechnen
sa9311 LORA #32 Lsercade
59913 STAA .2a9) ,Y in Bildschirm-RAM kbrinsenr
59313 JISR 05898598 > Background-Coler in Color—-RAM kringen
59918 NOP
s9919 DEY alle JG Zeichen gelnescht”
sag92a BPL 59911 Nein: weitermachen „...
s9922 RTS
eeichen “Accuy> und Farkcocode Kim FR? auf Cursarposition speichern
3923 TAT Accu merken
3924 LOA #2
eI992E STA Pd 5 be! Zaehler fuer Elinkdauer des Cursars fuer REPERT>
53923 ISE 79944 > Pointer in Colaor-RAM kerechnen
s93331 TYA
9332 LET il Feinter zuf Lursorspalte
53324 STA Da 5: Br BR u Zeichen speicherrn
739358 TARA
aAaF:r STA Du Sr 2 BEL ı Farkwert speichern
3333 FRT=S
233
Br &7+ ERrR=SIc „zZ - - - - - - => 94m
Pointer in Ceolar-RAM aus Pointer in Bildschirm-RAM berechnen
9340 LDA 2a9 Position des Lursors im Bildschirm-FRAn
53942 STA 243 in Position des Cursors im Colar-Nvkkle—-RRAM
9944 LOA 210 umwandeln
5939468 AND #3
53943 QRA #216
593954 STA 244
39932 RTS
IRQ-Rautine, wird im Narmalfall alle sdistel Sekunden aufgerufen
59953 JSR 65514 > UDTIM. Uhrzeit um eine 68608stel Sekunde weitersetzen
5993565 LDRA 204 Cursar eingeschaltet”?
59958 BNE sa001 Nein: Cursaor-Behandlung ueberspringen
S99680 DEC 205 Zaehler fuer Blinkdsuer des Cursors vermindern
59962 EBENE 80081 Zeit „orbei? Neins weiter sa001
59964 LDA #20
59965 STA a5 Zaehler wieder meu initialisieren
59963 LDY z1l Lursorspalte in 'R
s99r7a LSR 207 Fl29 fuer Cursor \hell’dunkel>
S9972 LOX 547 Farkcode unter Cursor
59975 LDA 2095 ,'Yr Zeichen unter Curscar „cam Bildschirm lesen
59377 BCS 59996 war Curscar dunkel? Nein: weiter hei 39996
5399793 INC ea” Flag fuer "Cursor hell’ setzen
59981 STAA 2086 Zeichen unter Cursor merken
5939333 ISR 539948 > Pceinter in Color-RAN berechnen
S9936 LDA 2437. Farbcode unter Curscor
59938 STA 47 merken
59991 LOX SE nomentanen Farkcode (Cursar- und PRINT-Farke) ins #R
59994 LDA 2085 Zeichen unter Cursor
39998 EOR 4128 imvertieren
59998 ISR 599332 und zusammen mit Farbkwert zuf Bildschirm kringenr
8RBBB1 LDOA 1
geaaa3 AND #16 Reccrdertaste sedrueckt”
s0805 BEQ $U017 Ja: weiter kei 54917
sauna? LDY 40
saaa? ST'r 132 Flag fuer Matarkontralle lceschen
saa11 LDOR 1
saa1l?3 ORA #32 Matcr ausschalten
80015 BNE 5099253 Unkedingter Sprung
saalr7 LDA 192 Flay fuer Natorkantralle aesetzt?
sG0819 BNE sadzr Nein: weiter hei 84027
saaziı LDA 1
80023 AND #31 Motor einschalten
89825 STA i
saa27 ISR 80039 > SCHEEYT, Tastaturakfr24e
saaza LDA 56333
saa>33 PLA Reyi=zter wiederherstellen
saa3g4 TAY
g80a35 PLA
saa36&s TAX
0337 PLA
5038 RTI
234
CBr &+ BRSIC zZ - - - - - - nt u 5 Br u
SCHKEY, Tastatur akfr age
80R39 LOA Ha Flag fuer Shift “Bit ©), CBNM-Taste (Bit 1)
88Q41 STA 553 und Control “Bit 2> loeschen
89044 LDY #64 j
89Qa46 STY 03 Tastaturcode mit 64 Ckeine Taste gedrueckt)> vorkelesen
68048 STA 586328 Null nach 59320 \fra4t alle Tasten ak)
saa51l LDX 56321 Coalumm-Select
60054 CPx #255 = 255 (keine der Tasten sedrueckt>”
g8a0SE6 BEU 64155 Ja: weiter kei 540138
89058 TAY YR :=
60059 LDA #129 2g457 2465 ı= 50289
6BR51l STR 245 (sStartadresse der Tastaturdecadierungstzkelle>
gsaas3 LDA 4235
60965 STA 246
saa67 LDORA #234 erste 5palte akfragen (Bit A geloescht>
8sua69 STA 36320 nach Row-Select krinaenr
gsaa72 LDX #83 Zaehler fuer 38 Spalten
68074 PHR <Mert fuer Raw-Select) merken
89075 LOAR 586321 Dekaoder -Rusuang
80073 CMP 58321 nochmalige Abfr=zse zum Enterellen
saag1 BNE 80075
EAaS3 LSR Bit herausshitten
80084 BCS 8EA1LAZ gesetzt (Taste nicht sedrueckt)? Ta: weiter hei Sulds
saa86 FPHR Wert merken
69087 LDR 2453) .Y Wert aus Takelle halen
80983 CHMP 49 groesser als 4 keine Kantroalltaste)
68091 BCS 601095 Ja: weiter bei 64105 |
saua93 CMP #3 oder wleich 3 “RUNSTOF-Taste)”
6880895 BEQ 580105 Ja: weiter kei 80145
sau9? ORA 853 entsprechendes Fl=a fuer Shift, CBM-Taste
sa1LAB STA En oder Control setzen
sa1la3 BPL 680107 Unkedingater Sprund
sa1la5 STTr 203 Wert als Tastaturmatriscade speichern
88187 PLA Wert zus Dekoder-Ausazng wiederherstellen
sales INY
893109 CPY 4655 alle 84 T=a=sten akaefr=a4r?7
8a1 il BCS 6124 Ja: weiter kei sal24
sa1 13 DEX Zaehler fuer Raw-Select vermindern
68114 BNE s$aA23
8B116 SEC. Carrv setzen (fuer RüL)>
898117 PLA Wert fuer Rau-Select wiederherstellen
sal 18 ROLL und selseschtes Bit weiter nach links verschieben
88119 STAR 56320 fuer Columm-Select neu speichern
6B122 BNE 50972 Unkedingter Sprung
68124 PLA Stack naormalisieren
68125 JMP 635) Normalwert des Yektorzs (8599/85565 Baer
69128 LDYV 203 Taststurmatr ixcode
sa1l39 LDA 2453) ,Y Mert zus Dekadierunastakbelle lesen
68132 TAX im XR merken
68133 CPY 197 mit Wert aus vorherigem Aufruf warı SCHEET veraleichen
68135 BEQ 608144 identisch? Ja: weiter kei 8a1d44
68137 LDY #16 neue Taste;
68139 STY 652 REPERT-Zaehler neu initialisieren
68142 BNE 68198 Unkedinater Sprung
69144 RAND #127 Bit 7 loeschen
68146 BIT 659 Flag fuer REPERT
68149 BMI 8609173 Bit 7 gesetzt (Repest 11er Tasten)? Ja: weiter kei 84172
62151 BVS 609226 Bit 5 gesetzt “kein Rereat)? Ja; weiter kei Size
235
- En
SCHKE',
541323
s4155
50157
59159
salsiı
sa1l5?
81655
salsr
sa159
saiYvi
sa1l?3
solre
sa1r78
salsi
sa183
sa1SE&
SALZ
sa1laa
80193
84135
ea196
501938
go2aA
ea2B2
sa205
50203
sazıa
sa212
ec213
50215
saz2183
so2za
sazz23
e.a22g
Baz2zE
saz28
50231
CHP
BEQO
CMP
BEO
CMP.
BEO
CMP
BEN
cHP
ENE
LD'Y
BEQ
DEC
BNE
DEC
BNE
LDY
STYr
LDY
DE'Y
BPL
LD'Y
STr
LO
ST'r
CP%
BEQO
TEA
LO
CP
BCS
STA
IN*
ST-
LODA
STA
RTS
#127
80193
#420
5a173
#32
sa1 73
#23
LT c p Erg
#17
sa225
532
sa133
wann dm
nNALWDASD CT
Tastaturabfrase (Fortsetzung)
Zeichen?
weiter kei 69198
Lade fuer "DELETE"?-
Ja: weiter hei 64173
Code fuer "SPRCE"”
Ja: weiter kei 84173
Cade Fuer "CURSOR RIGHT"?
Ja: weiter kei 684173
Code fuer "CURSCOR DOUN"T
Nein: weiter kei 84226
zZaehler fuer Anspruchszeit fuer REPERT abgelaufen?
Ja: weiter kei 69133
Zaehler weiter herakzaehlen
= @? Nein: weiter kei 59226
Zaehler fuer WMiederhcalungasgeschwindiakeit herakzaehlen
= Gd? Nein: weiter kei Saz2E
Zaehler fuer
Tasterwiederholungsseschwindiukeit neu
Anzahl Zeichen im Tastaturputffer
kein
initisalisieren
unaleich Null? Jar weiter kei Sa226&
Tsstaturmatrixcodes umspeichern
ebensa die Flays fuer Shift. CBM-Taste und Control
2337
Zeichen zus Dekoadierunuvstakelle =
Ja: kein Zeichen. weiter kei BuZ26&
in Tastaturpuffer
mit maximaler Anzahl Zeichen vergleichen
Groesser cader aleich? Jas nicht akspeichern
sonst Zeichen am Ende des Tastaturpuffers anfueger
Anzahl Zeichen
Anzahl Zeichen um eins erhceher;
NHormalwert
in Raw-Select einschreiken
Umschaltung von Graphik und Mleinschrift ueker Commadare-Taste
Nu Lid Wi
JENE UNUD
Thy hohen nnd ha
YES HH AH HM
x)
Pe fa RD a ran DIDI II DD SO MD DO BI I DJ DS DI
au) ae u ca Ba Da Sa DE SD DE |
Dh ide Zain» m
LOA
CcHP
BNE
CHF
BED
LDA
EMI
LOA
EOR
STA
IMP
ASL
EpP
BCC
LOA
TAH
LEOA
STA
L.0A
STA
IMP
ıı
# if
ONMMONT LEDIG
4)
De)
Jı
pe]
— fü fi fü Po
ML EM
DT Pin m
„,
‚r er
Fl=a3 fuer Shift, Commodcare-Taste und Control
Shift und Conmmacdconre-Taste gedrueckt?
Nein: weiter hei 5.0264
uaren Keide Tasten schen beim letzen Rufruf sedrueckt?
Ja: Abschluss SCHEET, weiter kei 692268
Umschaltung klockiert (val. Ssa51a- fr)?
Ja: weiter kei 60128
In=chaltunga fuer Graphik und Kleinschrift
> weiter kei SAl28
var die Control-Taste yedrueckt?
Hein: weiter kei 60257
Offset fuer T=z=staturdecadierunaspeinter 690536
auf Decodierunastsbelle setzen
Pointer 243.246)
>» Fortsetzung der Taststurakfr age
236
Sa 1523
CB ©&©+ PBHSIc
Pcirter zuf Tasstaturdecodierungstabellen
sa2s1 161
80233 194
80235 2
sazesr7 124
Tabellen
802533 2a
801239 65
sa3a9 67
ea319 85
sa3293 43
84339 59
80349 32
8a354 1483
sa3s4 193
sa3rd4 195
89384 2173
sa394 219
sadad 93
sa41g4 160
ea4193 148
esa429 176
saA4393 188
sad49 154
80459 186
ea4s9 93
sa4rY9 1jsu
235 50289 Takelle fuer einzelne Tasten
235 80354 Takelle fuer Tasten zusammen mit Shift
RIcTS 80419 Takelle fuer Tasten zusammen mit Commadore-Taste
236 EOIIE Takelle fuer Tasten zussmmen mit Control
fuer Tast=turdeccodierung:
13 29 136 133 134 135 17 51 87 einzelne Tasten
a2 9a 33 659 1 53 82 68 54
ra 34 85 55 59 71 TS 55 72
Se 57 73 va 48 VYY’ 75 79 78
sa Te 45 46 58 6864 dd 92 42
19 1 8ı 9 47 49 55 4 50
2 81 3 259
141 157 140 137 138 139 145 35 215 zusammen mit Shift
238 218 211 137 ı1 37 21a 196 38
198 zı2 216 393 217 199 4a 194 za
214 41 221 202 483 205 203 207 206
zas 204 221 862 931 186 8a 169 192
147 1 81 222 683 33 55 4 35
8 209 131 255
141 197 140 137 1393 139 2093 15a 177 zusammen mit Commocdore-Taste
151 173 174 177 ı 152 1759 172 153
187 163 189 154 153 165 155 151 184
155 41 182 181 48 1857 151 185 17a
175 1982 zza 82 931 184 5a 163 223
147 1 81 222 63 1293 95 4 149
z 171 131 255
weitere Zeichencodes akfragen “siehe 59345 und 53395135
sa4agt
sad4sE
sa4ss
sad4g1
804933
509435
5a497
sa429
CHIP
BNE
LOR
ORR
EHE
CMP
BNE
LOA
ANGE:
STA
” JMP
CMP
EHE
LOA
ar
EMI
cHP
BHE
DA
RHO
STA
IMF
*
Dee Bee ze vr)
{n
Ian ch cr)
I sn nu
I.
Code fuer "Grass- und Kleinschrift”?
Nein: weiter kei 60495
Eit 1 setzen
Unkediruter Sprung
Code fuer "Grossschritft und Graphik”?
Heins weiter kei saS1a
Bit 1 lceschen
> Ausaake akschliessen
Code Fuer "Blockierung der Shift- und Commadore-Taste”?
Nein: weiter kei SuaIzl
Bit ”
in SI setzen
Inkedinater Sprung
ode fuer "Freiqake Jer Shitft- und Commodcere-Taste””?
Nein: keine weiteren Codes mehr, Rusygake abschliessen
Eit 7
in 657 l\ceschenr
>= Ausashe akschliessenr
237
Er S4 BHSIc WvVZ - -
Tskelle fuer Ta=staturdekodieruna
sas3E 259 259 259 2959 255 259 255 2597028 23
80545 1 159 26 193 5 255 1565 18 4 34
[=1% beta] = 3 8 20 24 31 25 ”’ 153 2 &
sazsseE 21 22 183 3 1a ids 13 11 15 14
gsasr7s 255 16 12 255 255 27 a 255 28 255
s0a536 29 255 255 31 3a 255 144 E& 259 =
saS96s 255 255 17 255 255
Daten fuer Yideo-Controsller
sasa1 a a a A a a a [2] [5 a
806811 a a a a a a a 155 595 5)
saesz21 a a S a 2a 1° a [5 a a
806531 a a 14 5 1 & 3 + a 1
stsd4i e 3 4 S & Tv
Text fuer RUNSTOP-Taste
esgedsE VE 79 85 63 13 S2 85 75 13
Takelle der LSEs der Bildschirmanfaerge
sa6IE a 48 Sa 12a 16a zoa 24a
sass5 144 194 224
sasrYE 32
24 64 164
SS 48 8SS 128 163 203 248
v2 112 152 192
Si
Rautinen zur Bedienung des seriellen Bus
TALK und LISTEN
sa681 ORRA #54 Bit © setzen. TALK
ST SE
zusammen mit Contral-Taste
"LORE" CR "RUN" CR
> Marten. his RS-232-Datenuebertr agung beendet ist
Accu kann nach Rufruf von 81879 nicht aleich &3 sein
80633 BIT Bars
8sR&E34 ORR #32 Bit I zetzen. LISTEN
80685 JSR 61604
eas89 PHA Accu merken
s8a690 BIT 148 Zeichen im Puffer”
80E92 BPL $ar7ad Nein: weiter kei 8Ara4
80694 SEC
80693 ROR 1&3 Flaa fuer EOI setzen
8606597 TISR 84736 > Buvte ausgeken, EOl
saraR LSR 148 Flag fuer "Zeichen im Puffer” lceschen
sa7az LSR 163 Flas fuer EOI loescher
sarad PLA Accu wiederherstellen
84705 STA 1493 und in Puffer bringen
8B7U7 SEI
E70 JISR 861479 > Serizl Data := law
epr’ııl CMP #53
80713 BNE 860718
8715 ISR $81a6l > Clock Out := lau
earı1S LDoR 38578 RTN := hiah
ga721 ORA #3
sa7z23 STA 56576
gu7Y2&5 SEI
&0727 JISR 61070 >= Clock Qut := hish
80730 JSR 510979 > Seri=l Data := 1Iow
8a7’33 JSR 61107 > Verzoegerunasschleitfe
238
cBPrH S54 PBRS>SIcCcC WW = - - - - -
Brte auf Bus ausgeben
89736 SEI
68737 ISR 61479
60748 ISR 61097
80743 BCS 869845
60743 JISR 61061
60743 BIT 163
60738 BPL 609762
80752 JSR 61997
807535 BCC 60752
60757 JSR 814997
60768 BCS 80757
69762 JISR 861097
69765 BCC 60752
68767 JISR 61078
60779 LDA #8
68772 STA 165
68774 LDA 58576
60777 CMP 56576
6078QA BNE 609774
sa782 ASL
60783 BCC 59348
60785 ROR 149
80787 BCS 60794
60789 JISR 861088
68792 BNE 69797
8a?794 JISR 81079
60797 JISR 6s1B61
8BERB NOP
88891 NOPF
68892 NOP
60883 NOP
6034 LDN 5686576
688907 RAND 4223
80309 ORA #16
sosll STA 56576
68814 DEC 165
62816 BNE 509774
68813 LDA #4
68328 STAR 56327
69823 LDA #25
608235 STA 356335
690828 LDR 36333
sa831 LDA 56333
68834 RND #2
60836 BNE 69848
68838 JSR 61997
608841 BCS 850831
69843 CLI
60844 RTS
Fehlerbkehandlung
68845 LDA #128
608847 BIT re
620848 LDA #3
60858 JSR 63052
69853 CLI
60854 CLC
688535 BCC 69931
> Serial Data ı= low
> Serial Dsta akfragen
=1? Ja: Bit ” (Des,ice mat present) im Status setzen
> Clock Qut := low
Flz4 fuer EOI “wesetzt?
Nein: weiter bei 860762
= Datenkit vam Bus halen
=1? Nein: warten .„.. (warten,
> Datenkit „om Bus halen
=9? Nein: warten .„.. “Timeaut fuer EQI erzeugen?
> Datenkit vom Bus halen
=1? Nein: warten .„.. “warten.
> Clock Qut := hiah
kis Listener bereit)
kis bereit fuer Daten?
zZaehler fuer S Bits setzen
Port A lesen
Listener bereit”
Nein: Fehler. weiter kei 684848
Bit aus Ausasberegister herausshitften
Ist Bit = 1? Ja: weiter bei 684794
> Serial Data := hisah
Inkedingter Sprung
> Serial Data := 1cow
> Clock Qut := lcu “datz „alid)
Serial Data := lcaw
Clock Qut := hiahı
Bit-Zaehler vermindern
alle Bits ausgegeken? Nein: weitermachen ...
Timer B fuer Wartezeit setzen
Madus fuer Timer B setzen
Bit 1 gesetzt (Timecaut Timer BJ?
Ja: Statuskits fuer Zeitfehler setzen
> Datenkit vom Bus halen
=9? Nein: warten ...
Bit 7 fuer "Device nat present”
Bits a und 1 fuer Zeitfehler
> Status setzen
weiter kei 60931
239
kiz Listener Empfang quittiert hat)
_- Er
SECOND. Rusaa=ke
CIOLT
503933
sa895
60337
Bag9S
saraa
saaaz
saaa3
s09a&
sasar
50909
sag1d
UNTRALE.
50911
gsa91z
83315
509318
sa92a
8923
650925
50928
80328
50931
50934
80933
50937
5a93S
gsca94a
50941
sa>44
STA
JSR
LOA
RND
STA
RTS
Sekundsaeradresse nach LISTEH
Sekundseradresse in Ausgakeresister
> Sekundaeradresse ausgeben
HTH := lau «Kaontroal}—-Madus beenden?
ARusgake Sekundsaeradresse nach TALK
STA
JSR
SEI
JSR
ISR
'ISR
JSR
BMI
CLI
RTS
BIT
BI
SEC
ROR
BNE
PHR
JSR
PLA
STR
CLC
RTS
SEI
JSR
LDRA
ORR
STR
LOR
BIT
LDA
JSR
ISR
TARA
LO“
DE*
BHE
TAX
JISR
JMP
und
581097
BaASSE
1498
saIa2
UNLISTEN
1a’
38376
#5
SeEs7E
#95
Sekundseradresse in Ausgakereaister
> Sekundsaeradresse zusaehen
= Serial Data := high
> ATNH := lau
> Clock Qut =
> Clock In = 07
Nein: warten ...
lcou “Kantral1-Modus beenden?
-r Zeichen zausgeken (Pufferung fuer EOI>
gepuftfertes Zeichen varhanden?
Ja: weiter hei 68649242
Flas fuer "Zeichen im Puffer” setzen
Unkedinater Sprung
>= Beute im ARusqsakereaister zuf Bus aussekenr
Zeichen in Pufter- kringen
> Clock Qut := hiah
ATN := hiah
Kennzeichnung fuer UNTALK
Kennzeichnung fuer UNLISTEN
> Ausgake mit ATN = hiah
= ATN := lou <Kantrol1-Poadus beenden?
xR merken
Verzoeserunasschleife um ca.
“R wiederherstellen
> Clock Qut := lau
> Serial Data := Tau
240
sa Mikrosekunden
CC El
ARCPTR.
By
Be ac a Du ST SE u u Ba A ra u 55
hohen hd
ID rar ann
NENENETERERERETEN ET ERERETERERET ER EN
2 PB ONGDe NDS ADD
N Er En
T
Da)
re)
ı
S Bits
sıaild
6116
61918
sıa21
81a24
81925
5127
61929
61931
51934
81937
6133
61948
61942
51944
slads
61949
s1asi
61953
61B5E
81958
51A59
61968
sıcsl
51064
s1ass
51069
—
Zeichen
SEI
LOA #G
STA 1655
JSRO9O81as1
JSR 981497
BPL #54355
nA #1
STAR 75327
LDA #25
STH 76335
JSR 81479
LOR 55333
LOA 36333
AHO #2
EBENE 84994
JSR 72810997
EMI 64976
BPL s1a1id
LDA 167
BEQ 59999
LDA #2
JMP 80850
JSR 78610383
JSR 29 8s1i1asi
LDA #54
JSR O9 022
INC 1655
BNE 84960
holen
LOA #3
STR 183
LDA 585376
CHPU4 56576
BNE 81@18
ARSL
EPLOÄ16&61UG1S
ROR 1654
LDA 2 Se57E
CHPUXIS57E
BNE s1031
ASL
EMI 61031
DEC 183
BNE 861618
’SR 81488
BIT 144
BYC 51056
JSR 6860934
LDA 184
cLI
CLC
RTS
LOR 58376
AND #233
STA 3585576
RTS
.3CHllt
Bus halen
16805 ı= @ vENI. falls Timeaut)
> Clock Out := lau
> Clack In = 1?
Neins warten ...
Martezeit fuer Timer RB setzen
Macdus Fuer Timer R setzen
> Serial Data := low (ready For data)
Bit 1 “«Timeaut Timer BR) sesetzt?
Ja: weiter hei 80990
> Clock In = 8 (Start der Buvteuekertraguna?”?
Nein: warten „..
san=t Bvte san Bus halenr
1695 = 07
Ja: EQOI empfangen. weiter hei 68499:
Eit.1 “Timeaut.‘Imput)
> Status setzen. Fehlerkehandlung
> Seri=l Data := hiah GEÜUI accepted)
> Clock Qut s= lau
Bit & ‘End ar Identifw>
> Status setzen
185) = 1 “Zeitfehler. falls Timeaut)
weiter kei E4980, Daterkuvte nach EOI holen
Zaehler fuer 8 Bit setzen
Port A lesen
Clock In = 1?
Hein: warten kis Daten queltia
Daterbit (son Bit 8 kiss Bit 7) in
Port A lesen
1645 shiften
Clock In = A?
Nein: warten ...
sille 8 Bits sehcalt?
Nein: weitermachen
-
> Serial Data := hiahı
EOI aufgetreten?
Nein: weiter kei &61aS8&
> Clock Qut := low, Serial Data :=
tehcaltes Datenkuvte in Accu bringen
inct readv for data)
"Clock Qut” zuf lau setzen
241
_- Er1
+ FH Il “I - - = - - -
= 1570
Routinen zur Behandlung des seriellen Forts (Fortzetzuna?.
slara
5173
51073
51978
81079
slagz
silaS
51195
s11ar7
51148
s111lda
Si11lll
51113
Sılld
LER
OFRA
STA
RTS
LOA
RHD
STA
RTS
LOA
IFA
STAA
RTS
LOA
CMP
BHE
ASL
RTS
TARA
LO“
DEX
BNE
TA
RTS
#184
s111a
"lock Out” zuf hiah setzen
"Serial Data Qut” zuf law setzen
"Serisal Data Qut” zuf hiah setzen
Daten vom Port A lesen
Datenkit in Carrv schieben, Clack In im N-Flas
Verzoewerungsschleife um ca. eine Millisekunde
Rautinen zur Bedienung der RS-232 Schnittstelle
lieber tragung des nsechsten Bits vorkereiten
51115
581117
51113
s1121
51123
51125
81127
81123
51129
s1131
51133
81135
81137
51133
51140
s1142
81143
61145
51148
E11
s112z
s11nd
E11T6
81153
511359
LODR
BEQO
Bm
LSPR
LD«
BSCC
DE*
TARA
EOR
STA
DEC
BEOQ
TAR
AH
STR
RTS
LDA
BIT
BEO
BMI
BYS
LOR
BNE
DE#
DIEC
13a
81194
511984
182
#0
g1123
189
133
154
51143
#4
151
#32
Sg
Silva
Bitzaehler fuer Senden
= A iByte sollstsendiy uebertr=a9en?” Ja: weiter kei &11939
muss Stopkit uebertragen werden” Ta: weiter kei 681184
Bit zus dem Register fuer zu vebertragendes Byte schieben
Mlert a. falls Datenkit = @
Bit gelocescht? Ja: weiter kei 81128
Wert 255, falls Datenkit = 1
mit Resister fuer fuer Paritwkit verknueptfen
und wieder dort zbspeichern
Bitzaehler vermindern
= di Valle Daterkits vekertragen?? Ja: weiter bei 611473
Eit Z isolieren (Datenkit fuer Vekertr 34ung)
und im Register fuer zu sendendes Bit krirgen
Maske fuer Bit I Flag fuer Paritv)
RS-23Z Kommandoregister abfragen \
keine Vebertrzgung eines Paritvkits? Iaı weiter kei 61170
lebertr ang eines bestimmten Bits statt des Paritvbits?
QNdd Pzaritv”? Nein: weiter kei 81174
FParitvhkit = 17
Ja: weiter kei 61159
Wert 2595 fuer Faritv
Bitzaehler auf 259 setzen
242
CcBr 84 RBRHSIc WzZ - - - - = - =11=1
Uebertrasung des naechsten Bits varbereiten “Fartsetzung)
8s1ll6l LDRA 659 RS-232 Kantrollresister
81164 BPL 61137 zwei Stoppkits?” Nein: RAusaake des Paritvkits vorbereiten
81166 DEC 1808 Bitzaehler auf 254 setzen
81168 BNE 5611737 Unkedinater Sprung
6117Q INC 1808 Bitzaehler erhcoehen, da keine Fzritekit-Rusaskbe
sll172 BNE 51158 Unbedinater Sprung zur Bestiimmung der Anzahl Stoppkits
61174 LDRA 189 Paritvkit
81176 BER 61159 = 90? Ja: Wert a ausgeken
81178 BNE 61158 ansansten Wert 1 ausseken
81188 BVS 681159 ltebertraaung des Wertes A,
s1l182 BVC E81158 Uekertrasurga des Wertes 1 anstatt des Paritvkits
s1134 INC 180 Bitzaehler erhcaeshen “ist kei Stopepkit-Ausaakhe unter null)
Ss1186 LDX 4258 Wert fuer Stoppkit
61188 BNE 81137 Unkedinater Sprung
lekertragung eines Butes vaorkereiter,
81198 LDA 850 RS-232 Kommandoreygister
861193 LSR Handshalze-Macle
61194 BCC 61203 s-Line? Nein: weiter kei 61203
81196 BIT 56577 Part B {NMI-CIR> skfragen: lieat "ODSE IN” auf hiah?
61199 BPL 61230 Nein: ’DSR Sianal Missing”. RS-232 Status setzen
81201 BVCE 61233 Liegt ’CTS IN” auf Kiah? Nein: ’CTS Signal Missing"
812093 LDA #0
61285 STA 189 Register fuer Pruefsumme loescher
61287 STA 181 Resister fuer zu sendendes Bit laesschen “fuer Startkit)
61289 LDX 864 Register fuer Martliaenge
81212 STX 188 in Zasehler fuer Bits uekertragen
61214 LDY 569 Ist der Zeiger zuf zu uekertrzuendes Rute aleich
61217 CPY 878 dem Zeiger zuf die naechste freie Stelle im Puffer”
61228 BER 61241 Ja: alle Zeichen uekertrasen. Vekertr aygung akschlieszsen
61222 LDRA 243) ,W Zeichen aus Sendepuffer holen
61224 STA 182 und in Resister fuer zu vekertr=aumendes Bute krimmen
61226 INC 5669 Zeiger auf zu szsendendes Brte erhüehen
61229 RTS
61238 LDRA #64 Bit 8. ’"ODSR Sianal Missing”
61232 BIT a
61233 LDA #16 Bit 4, ’CTS Signal Missing”
61235 ORA 663 mit vorherigem Wert im RS-Z32 Statusreasister verkruertfer
81238 STA 663 und als neuen Wert wieder dart abspeichern
61241 LDA #1 Bitwert fuer ”TimerA-NMI sperren”
81243 STAR 56589 entsprechenden NMI im ICR sperren ”freiwekenr
61246 EOR 673 mit RS-232 Register fuer aktive NMIs verkruertfen,
61249 ORRA #128 Bit 7 setzen
61231 STA 673 nd als neuen blert wieder akspeicherrn
61254 STAR 36589 vebkrige aktive NMI=zs freigekenr
61257 RTS
243
ed — I 0
hd
u 7 ug © ©
DNMWDMmMM
NN cd
OD D CO
o,+ PeSHzsıIc Vz - - - - - -
LO“
LOA
BLT
BEQ
DE*
BWC
Dex
DE
RTS
42
#32
5539
612683
51272
=> 1253
Maskerwert fuer Bit 53
Testen der Bitkanfiguration im RS-232 Kontrollregister
Ist Bit 5 gosetzt? Nein: weiter hei 61268
Zasehler fuer Wartliaense um eins vermindern
Ist Bit 6 gesetzt? Nein: RTS
esehler fuer Wortiaenge um zwei vermindern
enpfangenes Bit verzrkeitenr
51er:
51275
sl2rY
51279
sı1281
512933
Anh
a u u
Wi) ia DI PO DO
DI
2NoO&0
<
ı
>
13 ı Bu H BC Bar Se Se See Se a Bu 53)
IEARNEREAENERRAENEAENEN)
en
Na
nen
NIT hi
eb ei fi fh fub fub fh jeb fub feub feh fh fand jaeb
Der
=
LO“
BHE
DEC
BEQ
BMI
LDOA
EOR
”’ STR
LSR
ROR
RTS
DEC.
LEIA
BEO
LDA
ASL
LOA
RODC
BNE
LODA
STA
ORA
STA
STA
LOA
JMP
LOA
BHE
STA
RT=
LE
IH'y
SPY
EEN
=T'r
DE'Y
LARA
LODGE
CF%
BEQ
LSFR
IN»
BHE
STA
ch
ee
JA ohnnIın
Nm enln ii cd
I
>
N Lo
70 I
"IND
J
ns2nn
=
Fi
eh
IM)
Startkit?
Ja: weiter kei 61328 r.
Bitzaehler vermindern
= AM KBute sollstaendig empfangen’? Ja: weiter kei 61335
sind “ncach) Stoppkits zu empfangen? Ja: weiter kei 61296
enpfarıgenes Rit
mit Resister fuer Paritvkit verknuepfen
und wieder dart akspeicherr
empfangeres Bit
in serielles Empfanasresister schieken
Bitz=zehler vermindern
enpfanseres Stoppkbit
= 4? ITa:r weiter bei 6861403
RS-232 Kantrollregister
Bit fuer Arzahl Stopepkits
Carr“ + 1 + Bitzz=ehler
alle Stoppkits empfangen? Nein: RTS
Bitwert fuer "FLAG-NMI (Startkit>, RS-232 IN freigeben”
ICR setzen
und RS-232 Resister fuer aktive NMI= setzen
Flaa fuer Startkit setzen
Bitwert fuer "TimerB-NMI sperren”
-
> ICR und Resister fuer aktive Nils setzen
Sstartkit
= AM? Hein: weiter bei 61310
zonst alles in Crdnmung,. Flaa fuer 5Startkit ruecksetzen
zrkeituna de= emPrfangenen Rytes
Zeiger auf Ende des Empfanygspuffers sleich
dem Zeiger auf Anfang des Empfangspuffers <val. 861463)
Ja: Vekerlauf des Empfangspuffers. weiter kei 613936
erhcehten Zeiger auf Ende des Empfangspuffers setzen
enpfzngene=s Evte
<Shift-Register wurde von rechts her aefuellt)
sa aft nach rechts verschieken,
bis erstes empfangenes Bit an Bitposition 8 steht
enpfznaenes Rute im Emefangspuffer akspeichern
244
c- Er
> PFEeM>SIc zZ - = - - - -
S13857232
YVerzrkeitunga des empfangenen Evtes “Fortsetzung?
51363
681365
51368
e13ra
581372
61374
51376
613785
681384
61381
61333
5613985
81386
6851383
61339
81391
861392
61394
51397
s14ma
Aufruf, falls Stoprkit
81403
514095
s14ar7
LOIA
BIT
BEQ
BMI
LDR
EOR
BEQ
BVS
BIT
BYWC
LDA
BIT
LDA
BIT
LOA
BIT
LOA
ORA
STA
JMP
LODA
BNE
BEO
432
EA
&1294
61293
167
171
81381
61293
61293
#1
#4
#128
#2
5523
663
5131@
170
51392
51383
Maske fuer Bit 5
RS-232 Kommandoregister pruefen
keine Uekertraqsung des Paritykits? Jas weiter kei 61294
wird ein bestimmtes Bit statt Paritykit vebertragen? RTS
empfangenes Paritvkit ö
mit errechnetem Wert verknuepfen
Gleich?” Ja: weiter kei 61381
Even Paritv? Jas alles in Ordnung. RTS
Odd Parit.? Ja: alles in Ordnung. RTS
Bit a. ’"P=aritv Error”
Bit Z, "Receiver Buffer Wverrun”
Bit 7”, ’Break Detected”
Bit 1. "Framingag Error”
mit vorherisem blert des RS-Z32 Statusregisters
verknuepfen und wieder akspeichern
> Empfang des neuen Burtes vorbereiten
- a
serielles Resister fuer Bvte-Empfang
uurden schon Bits empfangen? Jas ’Framinga Error”
ansonsten ”"Break Detected”. weiter kei 61389
CHKOUT-Handling fuer RS-232
81449
sid4ll
141g
81415
61417
51419
81422
81424
sid2s
61429
81431
81433
81436
81438
81441
1443
61446
81449
eilig
CHROLT,
I ch T ıJı
Ib beub je fen
STR
LDA
LS
BCC
LODA
BIT
BPL
BNE
LODRA
AND
EBENE
BIT
BYVS
LOA
üorr
STH
BIT
BVS
BMI
LOA
STA
LLC
RTS
JSR
LO
IN'r
CP'Yr
BEÜ
lei
chen
aktiven RAusaskekanal festsetzen
RS-232 Konmmandcregister
Handshake-Mcacde
“-Line? Nein: weiter kei 61458
Maske fuer "RTS OUT”
Part B «NMI-CIR> akfrasens lieat ”7DSR IN” auf hiah?
Nein: ’DSR Signal Missing”, RS-232 Status setzen
Liegt "RTS QUT” <Sendeanfrage) auf hiah? Ja: fertig
Merden momentan Daten empfangen?
Ja: warten „...
Lieat ’CT3S IN” zuf lou C<Empf3aenger bereit)?
Nein: warten ...
"RTS QUT” zuf hiah setzen “keine Sendeanfrage?>
Lieyut "CTS IN” auf hiah”
Ja: fertig
zurueck nach 81446, solange "ODSR IN” auf hiah lieat
RS-z32 Status auf "DSR Signal Missing” setzen
> eutl. RS-23Z Vebkertrauuna in Gang bringen
in R=-Z32 Senderuffer kringen
Zeiger zuf naechste freie Stelle im RS-232 Sendepuffer
schon keleat “Test. ck Zeiger van unten den Veber-
trragumaszeiger erreicht har Puffer wird "rundherum"
kenutzt)”? Ja; warten kis Platz im Puffer
245
c-Erti
=+ PeHhsSIc = - - - - - -
seo2357
SECOND, Ausgaake Sekundaeradresse nach LISTEN
509537
5809539
sasez
508553
saS3&7
SasrTE
TKSR,
DEE ur ENT)
UNTALE und
sas1l
Baal
84915
59318
saaz2d
sa9z23
80925
5a925
ga323
849331
50334
80935
saa3T"
Ea3233
Eaa4a
s0941
sa944
sta
ISR
LDR
AND
STR
RTS
Sekundsaeradresse in Rusagakeresister
> Sekundaer adresse ausaesben
RTH := lau <Kantr-cll1-Madus Kkeenden?
Rusgake Sekundaeradresse nach TRAILK
STA
ISR
SEI
JISR
JSR
SR
ISR
BMI
CLI
RTS
BIT
BI
SEC
FOR
BNE
PHH
JSR
PLA
STR
ELC
RTS
SEI
JSR
LDR
OFRA
STA
LOR
BIT
LOA
JSR
ISF
TA
LDı
ul 23
BHE
TA»
ISR
JMF
148
Sa9az
148
sa>ar7
LNLISTEH
s1ar7ıa
IS2Y76
Sekundsaeradresse in Ausy=zkeregister
> Sekundseradresse aussehen
> Serial Data := hiah
ZZ ATN := low
> Clock Out ı=
> Clack In = 07
Nein: warten ...
lau «Kantroli-Madus beenden?
r Zeichen ausgeken “Pufferiuna Fuer EOID
gepruffertes Zeichen »varhanden?
Ja: meiter hei 60902
Flaa fuer "Zeichen im Fuffer” setzen -
Unkedinater Sprung "
> Beute im Ausasakeresister zuf Bus ausgeben
Zeichen in Puffer bringen
> Clock Qut
ARTN := hish
= hiah
Kennzeichnung fuer UNTALKE
Kennzeichnung fuer UNLISTEN
> Aussake mit ATHN = hiah
= ATN := low iKantral1-Moadus keender?>
SE merken
Verzoegerunasschleife um ca. 7a Mikrosekunden
AR wiederhersteiller
> Clock Dut ı= lau
> Serial Data := 1ow
246
CC EBnr1
7)
=E
a
er
vr.
nn cd
bb je fe juh fenb jan a fand fen
INCH LNIR CA EN N in
a a |
AV SNNMNWD AL
Warten.
51604
816805
s1hls
s161a
61613
616153
s1l6lr
61619 !
slhzz
ele24
1627
sie28
ct = = Bo u ui un am rn 2 = =
kis RS-232 Dateruekertrasurng akgeschlasser
17,74
zauz R=-222 Empfzngzpuftfer halen
RS-23E Statuskuvte in Accu kringen
Zeiger zuf naechstee Zeichen im PRS-Z32 Empfangspuftfer
4leich dem Zeimer auf Jas=s Ende des Emetangspurffers?
Ja: keine Zeichen „arhanden, weiter kei 617976
Eit 3 “Zeichen weltigs> im RS-Z32 Status lceschenr
und in Register fuer RS5-232 St=tus akspeicherHn
ceichen aus RS-232 Empfzanaspuftfer lesen
zeiger zu4f naechzstes Zeichen im Empfangaspurffer erhoehen
Bit 2 (Empfanaspuffer leer) im RS-232 Status setzen
und im Reuister Tuer RS-232 Status akspeichern
Code rulıl aAlz Ersatzwert
ist
Rcecu merken
erden momentan
Nein: fertisa
Akwarten,. kis RS-232 Datenuebertr agung akgeschlassern
Daten ueber den RS-Z3Z2 Kanal uvebertr augen?
FLAG-NMI dis=klen
RS-232 Register fuer aktive NMIs auf null setzen
Recu wiederherstellen
247
—FRrtl
Meldungen
s18529 13
siedl 13
Blenz2 ya
s1856 13
Ssisss 79
slsr’a 50
S18S8 38
815395 73
elvraz 13
siria 172
slyY1s 13
alvz2a 13
&e1735 123
Ausaske var
81739 BIT 157
sivrd4i BPL 61758
s1rd43 LOAR 8516293.'YT
sirdeE PHP
81747 AND #127
81749 ISR 65490
81752 INT
51753 PLP
s1lr7ad4 EFL 81743
e1rTe CLC
51757 RTS
GETIN. Zeichen var
81753 LDA 153
eivrsa BNE &6177a
81762 LOR 1383
slv’es4 BEU 61751
eilvress SEI
gslrer ImMP 58304
slrra CMP #2
eilvY’Zz BNE 81798
81774 5STY 151
E1lrr’s JSR 861574
81772 LDY 151
817851 CLC
CHRIN,
oA
BNE
LOR
STR
LOA
STA
JMP
Aha
Ib bb fe fe fuhr fe [ee
SIASINN NN
Did own wi
Ned Nm
Mn
pers
J
ıD
&
CMP
BNE
STA
LOA
STA
JMP
zum
ma, ac Bas a Be 1 ET En BEE ES a er
IC u Su FU 5 Dur 6 u 2 CE SU = BT a Be YA
Jhd Joa una >
A BEN OENB A BEN Eu N TEE NE RE REES
1a Bu» su) Ba Ss DEE PURE SEE Fe ER Ba)
DO eh
en
[er \
L
peut
I1’ü-Hzndlina
32 89 82 SZ 79 32 32 163 1.0 ERROR #
Ss2 87° T2 73 v5 7ı 168 SERFCHING
FÜR
83 53 232 Sa TE 605397 32 PRESS PLAY
SI 500 197 ON TAPE
33 32 82 89 87’ 79 832 83 22 FRESS RECORD
It EE = 3 Br Fr 4% PLAY
Em 50 197 OH TRAPE
SS 73 78 199 LEORDING
3 73 71 150 SAWING
v3 va 89 73 7S 199 VERIFYING
‚8 62 169 FOUND
Ok.
I1’Q-Me1ldungen
153
&1798
211
202
214
ea
s93a
in
Rusaske unterdruecken «“Direktmadus)>”
Ruecksprung. RTS
Meldung im Bereich warn
nan 816829 Kiss 81737 ausgehen
JIas
> CHROLUT. Rus=ssaake zauf aktiven Rusaakbe-kKanal
Bit 7
Nein:
im Zeichen gesetzt?
weiter aussehen
aktiven Eingake-Kanal in Accu
aktiver Eingsabe-kKansl
= Tastatur >? Nein:
Anzahl Zeichen
=9? Ia: RTS
Interrupt „verhindern
Tastaturpuffer um ein Zeichen akkauen
weiter kei &1Yr7A
im Tastaturpuffer
aktiver Eingaabe-kKanal = 2 £R5S-232 Kanal?”
Neins. weiter bei 61738
YR merken
Zeichen aus RS-232 Empfanaspuffer holen
YR wiederherstellen
Zeichen vom aktiven Eingabe-Kanal in Accu
Eingske won Tastatur”?
Nein: weiter kei 61738
Lurscorzspaltenpcinter bei Aufru#
nach «2025 und
Cursorzeilenpcinter bei Aufruf
nach “2@1> speichern
> Eingashbeschleife zur Zeichenuekernahme vom Bildschirm
aktiver Eingazakbe-Kanzl = 3 (Bildschirm>?
Nein: weiter bei &1S1l
Flz4 fuer "Zeichen direkt vam
aktuelle Cursorzeilenlaenge
a1l=s Pointer fuer Ende der Zeile speichern
> Zeicheruebernahme vom Bildschirm
Bildschirm lesen”
248
CB &+ EBERHRSIC
=-1=11
CHRIN, Zeichen „om aktiven Eingabe-kKanal in Accu (Fortzetzuna)
81811
61813
81815
61817
51813
51922
51824
81325
51923
81838
681832
51834
519837
681839
E14
81842
51843
51944
81945
Ss124E
51943
619349
61932
5194
519357
51359
61381
51263
513653
51967
51963
513659
CHROLT,
51898
515339
61901
51923
51903
51906
BCS
CMP
BEO
ST“
JSR
BCS
PHRA
ISR
BCS
BHE
LOA
JSR
DEC
LDS
PLA
RTS
TAx
PLA
TARA
LD%
RTS
JSR
EHE
JSR
BCS
LDA
STR
BEO
LOR
CLC
RTS
LORA
BEQ
LDA
CLC
RTS
IMP
JSR
BCS
cHP
EHE
LDA
AND
BNE
> BEOQ
PHR
LOR
CMP
BNE
PLA
IMP
51869
#2
51830
151
81349
E1245
81349
81943
81337
#64
tut 5 be
1665
151
Eingake-kKanal > 3 Lzerieller Bus)? Tas weiter kei
sleich Z “RS-Z32 Kanal)?”
Jar weiter bei &
»R merken
>= Zeichen zus Puffer lesen.
Fehler” ITa: weiter kei 81348
qelesenesz Zeichen merkeri
> Zeichen aus Puffer lesen.
Fehler?” Ia: weiter kei 619343
Code = 37? Nein: weiter hei 81837
Bit 8 fuer ’End ar Indentitfw”
> 170-Status setzen
Pufferzeiser vermindern
SR vjederherstellen
gelezsenesz Zeichen wiederherstellen
enstl. Block in Fuffer lesen
e,st1l. Elcack in Puffer lesen
Zeicherccode im Accu merken
Stack rormalisieren
und Jen Zeichencade wieder in den Accu krinser
“FE wiederherstellen
-
= Pufferzeiger erhoehen: Test. ck Puftferende erreicht
Puffer leer? Nein: weiter hei 68156593
> Block „can Band in Puffer lesen
Fehler? Ta: RTS mit gesetzten Carrv
setzen
Pufferzeiger zuf erstes Zeichen
\nbedimater Sprung
Zeichen zus Puffer lesen
Carry fuer "kein Fehler” lceschen
1I"Q-Statusbuvte = 07
Ja: weiter hei 61377
Code fuer "RETUFH"
> ACPTR. Zeichen seriellen Bus haler
De Tut ic)
-
> Zeichen aus RS-232 Emprtfzangsputffer: holen
Fehler” Ia: FTS mit gesetzten CLCarrv
Code = 0?
Nein: Carrv loeschen,. FRTS
RS-232 Status leser
Bit I oder Bit & gesetzt?
Ja: weiter kei 61373
ansonsten zurueck nach 61330
Ausgabe auf aktiven Kanal
Datenkute retten
aktiver Au=ssake-Kanal
=3 «Bildschirm?>?
Nein: weiter kei 61909
Daterkute wieder halen
> Rusgake auf Bildschirm
249
ud 4 6 |
CHRÜNT. Ausgabe auf
81343 BCE 61915
813911 FLA
s191Z2 IMP 84593
81915 LSR
812165 PLA
81317 STA 138
819193 TEA
51920 FHRA
s1921 TrA
81922 FHRA
81923 BCC 61960
61925 JSR 83701
813923 BNE 81944
519336 ISR 6863338
81333 BCS 81949
51935 LOA #2
51937 LOTY 40
61939 STA «1783 .Y
51941 INY
81942 STTr 1&&
61944 LOA 153
81945 STA 179) ,.Y
51943 CLC
81949 PLA
519358 TAT
81351 PLA
81952 TAsS
51953 LDA 158
51955 BCC 81959
519357 LDA #0
81959 RTS
519850 ISR 81463 e
81963 JMP 819453
CHEIN, Vorbereitungen
81965 JISR 62223
61969 BEQ 8519374
512971 IMP 83233
&1974 ISR 62239
81977 LDA 186
81979 BEQ 820043
81981 CMP #3
819383 BEQ s2a03
81985 BCS 82007
81987 CMP #2
51939 BNE 51994
813351 IMP 851517
81994 LDS 155
81396 CP“ #96&
813395 BEGU 862003
seaaa TMHP 53242
s20a3 STA 13
5828003 CLC
52005 RTS
+ EHZ
aktiven Kanal
Il zz rn - - - - - > 1302
Fortsetzung:
M
Ausyake zuf seriellen Bus?” Nein: weiter kei &131!
Datenkute wiederherstellen
> CIOUT. Rusaske de=z Accus zuf seriellen Bus
Bit A der Aussaske-Kanal-Nummer in die Carrv-Fl3a34 schieben
Datenbute wiederherstellen
and zwischenspeichern
Indexresister zuf Stack retten
Ausgyake auf Band? Nein: weiter bei 81964
> Pufferzeiser erhoehen: Test, ok Pufferende erreicht
Puffer vall? Neine weiter hei 51944
>= Black warn Puffer auf Band schreiben
Fehler? Ia:r weiter kei 651949
Kennzeichnung fuer Datenklock
an erste Cassettenpufferpaositiaon schreiben
Cassettenpufferzeiger initialisieren
Datenkute kei Rufruf von CHROLT
im Puffer akspeichern
Carr» fuer "kein Fehler” loeschen
Indexreqyister wiederherstellen
. Datenbvte wiederherstellen
RTS
"BRERE". Abkruch durch RUNSTOP
Fehler szufgetreten? Nein:
Accu s:= r Fehlercode fuer
Zeichen in RS-232 Sendepuffer schreiken
Abschluss CHROUT
Nena
fuer Datenenmnpfana
> Fileparsmeter in Takelle suchen
gefunden?” Ta: weiter kei 61974
> 1rü-Error #3. "FILE NÜT OPEN"
> Fileparsameter zak:tuslisieren
Ger aetenummer
= 8 (Tastatur)? Isa:
= 3 “Bildschirm>”?
weiter kei 82043
Ja: weiter hei 62007
Geraetenummer > 3 (serieller Bus)? Isa: weiter kei 62007
= 2 «RES-232 Kanal>?
Nein: weiter kei 651994
> Eingabe van RS-232 Kanal varbereiten '
aktuelle Sekundaeradresse
= ?& “einzige Sekundaeradresse beim Lesen von Tape)”
Jar weiter hei 62003
> Tü-Erreor #6, "HOT OUTPUT FILE”
Gerzetenummer als aktiven Eingake-Kansal speichern
250
Ce &©&3+ BHR>SIcl zZ - - - - - - en nu In ie
CHKIN, Yorkereiturgen fuer Datenemefana Fortsetzung)
gs2aa7 TAX Gersetenummer inz FH retten
gszaag ITSR 8606581 > TALK.
szall LOR 185 aktuelle Sekundaer adresse
s2013 BPL 62821 kleiner 1287? Ja: weiter kei 82021
s2n1S ISR 80876 > Kantrollmaoadus heender
s201S IMP 6e2024 > naechsten Befehl uvebkerspringen
s2R21 ISR -SasV7i > TESA, Sekundaeradresse auf Bus aussehen .
s2a24 TSA Geraeterummer zu Bus zusgehben
s52025 BIT 144 Bit 7 im Irü-Stzatuskbvte gesetzt?
s2027 BFL AÄA$&20a43 Nein: Akschluss CHEIN
82023 IMP 53239 > 1TrO-Error #5. "DEVICE NOT FRESENT ERROR"
CHKOUT. Rusgabevorkereitungaen
s2za32 ISR 682223 > Filenummer in Takelle zuchen
52035 BEQ 2040 gefunden” Ta: weiter hei £Zza42
sza37 IMP 83233 > IQO-Erreor #33. "FILE NOT FOUND"
sza4a ISR 06822393 > Filerarzmeter aktu=lizieren
s2za43 LOA 186 Ger zetenummer
52045 BNE 82050 = & !Ta=ststur)? Nein: weiter hei 8Z24JI8
BziAd4r IMP 53245 > Trü-Error #7, "NOT OUTPUT FILE"
82056 CMP #3 Ger aeterummer
seanz2 BEU 8520659 = 3 -Bildschirm>? Iza: weiter kei 620689
seasSd4 BCS 52073 qroeszser 3 Wserieller Eus>?” Ja: weiter kei 6824”3
s2zass CMP #2 = 2 ıRS-232 Kanal)?
82053 BNE 829683 Nein: weiter kei 582053
szasa IMP 51409 >= Rusaake auf RS-Z32 Kanal vorbereiten
824573 LDX 1353 aktuelle Selsundasr adresse
82055 CPx #96 = 36 Leinziwe Sekundsaeradresse zum Lesen von Tape)?
s2as7 BEQ 62047 Ja: T/O-Errar #7. "NOT GUTPUT FILE"
s2za&s9 STA 1 I4 Geraeterummer als aktiven Ausuake-kKanal speichern
s2arl CLC
g2ar2 RTS
gear 3 TAX Ger aetenummer ins AR retten
s2a74 ISR 6065834 > LISTEN
82077 LOR 183 sktuelle Selaundaer adresse
82079 EBEFL 62086 kleiner 1237? Ja: weiter kei 52036
82081 ISR 808962 > Kontrallmoadus beenden
s2as4 BNE 62989 Unkbedingter Sprung
szuaS& I5SR 860857 > SECOND, Sekundaeradresse auf Bus ausgeken
szas? TARA Ger aeternummer. wiederherstellen
8209a BIT 144 Bit 7” im I/Q-Statuskyte gesetzt?
2092 BPL 2 62069 Nein: weiter kei 62063
82294 IMP 83239 > 1Ieü-Error #5, "DEVICE NOT PRESENT"
CLOSE, File “Nummer im RARccu) schliessen
g2a97 ISR 82
sziaa BEOQ 82
821082 CLC
82103 RTS
228 > Filenummer in Tabelle suchen
14 gefunden? la: weiter kei 82104
251
CB 85:4 EHASIC zZ - - = - - - 1094
CLOSE. File ©Nummer im Accu) schliessen “Fortsetzung?
s21G4 ISE 686223: > Fileparsmeter sktusalisieren
82107 TSA Feinter auf Parsmetereintrag in Filetskelle
82108 FHRA auf Stack lesen
s2ziaa LDA 136 Ger aetenummer
52111 BEQ 62193 = 8 (Tastatur)? Ja: weiter kei 621923
82113 CMP #3 = 3 “Bildschirm>”
82115 BEQU 521923 Ja: weiter hei 621933
s21l1v7 BC5 852190 Gerzetenummer + 3 (serieller Bus)? Ia: weiter hei 62194
82113 CMP #2 = 2 (ıRS-232 Kanal)?
s2121 EBENE s2172 Nein: weiter kei S21S2
2)
82123 PLA Feointer auf Eintr3s3 in Filetskelle „om Stack halen
S2l24 ISR 0862194 = File-Eintrag zus Takelle loescher
82127 ISR 625395 > RS-232 Vekertrzaung beenden
82130 ITSR 65053 > MEMTOP,. Lesen des Speicherendes
82133 LOR 2ı4R Hiahkute des Pointerze zuf den RS-2232 Empfanaspuffer
82135 BED 62138 = 0? Ia: weiter hei 52133
82137 INY Pointer high auf Ende Arbeitsspeicher um eins erhcaeher
521398 LDA za Hiahkberte des Faeinters auf den RS-Z32 Sendlepuffer
Ss2l1da BEQO . 62143 = a? Ja: weiter kei Sz1d43
s21d4z2 INY Pointer hiah auf Ende Arkeitsspeicher um eins erhoehen
82143 LDA 4a |
52145 5TA 248
s2147 STR sa Hiahkutes der R5-232 Puffer-Pointer zuf Hull setzen
52149 IMP 62589 > weiter kei 627339
s21S52 LOA 1853 abtuelle Sekundzer adresse
S21234 AND #12 Bit @ kis Bis 2 isolieren
S21S6 BED 862193 Lesen van Cassette? Ia: weiter kei 62133
52158 ISR 867440 > Peinter auf Czassettenpuffer nach (AR-TR> bringen
s2lel LDA 4a Markierung fuer "letztes Evte im Datenfile”
szls3 SEC Flags fuer Auszsasake zuf Recorder
s2ls4 ITSR 861917 > Zeichen in Cassettenpuffer bringen
s21&87 JISR 8635383 > letzten Block zuf Band schreiben
e2170 BCC 68621765 Fehler” Hein: weiter hei 82176
s2172 FLA Painter zuf Eintraa in Filetakelle vom Stack holen
82173 LOR #0 Accu := &,. Fehlercade fuer "BREAK", Rkekruch durch RUNSTOP
52173 RTS
sz1Yes LEA 185 aktuelle Sekundaer adresse
82179 CMP #33 = 38 “OPEN mit EOT-Kernnzeichnunga>”?
82130 EBENE 82193 Hein: weiter hei 82193
szi32 LODA #5 Kennzeichnung fuer EOT-Blocl
Bsz1&4 ISR 63338 > ECT-Block auf Band schreiken
s21S87 JIMP 862193 > weiter hei 62193
52190 ISR 853042 > CLOSE auf seriellen Bus ausseken
821933 PLA Pointer zuf Eintr39 in Filetsbelle vom Stsck halen
821934 TRA=s alz Index in=z AR kringen
82195 DEC 152 Zaehler fuer Anzahl an offenen Files um eins vermindern
82197 CP 152 und mit Pcinter auf Eintras in Filetzkelle vergleichen
52139 BER 2221 Gleich? Ja: fertiy
gs2201 LOY 152 Pceinter auf letzten Eintrag in Filetakelle
52203 LDA sal.Y letzten Tabelleneintr 33 in freiwerdende Stelle
sz208 STA 801 .X% .Eintras der zu loeschenden Datei> uekertragen
s2209 LOA sil,'Y
s2212 STA sil,.x
52215 LDA s21l,Y
822183 STR 821,8
s2221 CLC
82222 RTS
252
CO Br1
+4 PeH>ıiIcl zZ - = - - - - on
Filenummer in Filetskelle suchen
52223
82225
52227
82228
82234
52231
82233
682236
62238
LODA 4a
STR 144 Status l\ceschenr
TEA gesuchte Filenummer „an SR in Accu bringen
LDs 152 Zeiger in File-Tahbelle
DE* kereitszs alle Eintrsaege durchsucht?
EMI 82254 Ja: RTS
CMP 8al.x Accu mit Filerummer in Tabelle vergleichen
BNE s2234 IUIngleich? Ias weitersuchen
RTS
Fileparsmeter aktualisieren
82233
52242
52244
82247
82249
52252
52234
CLALL .
82255
62257
LDA gal,x Filenummer aus Tskelle
sTtÄ 184 alz aktuelle Filenunmmer zpeichern
LDA 811.8
sta 185 ebenso die Primseradresse
LDA g21.X8
sta 185 und die Sekundzeradresse
RTS
alle Files loeschen
LOA 40
STAR 152 alle Files lceschen
ECLRCHN, aktive IT/’/O-EKanzele schliessen. Standardkanaele aktivieren
82239
52261
52263
52265
822683
52278
B2272
5227
B2277
822723
82281
OPEN,
MN NM
LDS #3 aktiver ARusqakelianzl
CPX 154 aroesser als 3 Sserieller Bus>”?
BCS 62268 Nein: weiter hei 822688
JSR 84926 > UNLISTEN auf Bus ausgeben
CPX 153 Eingaskekanal wroesser als 37
BCS 6862275 Neins weiter kei 52275
JSR 284911 > UNTALK zuf Bus ausseken
STH 154 aktiver Ausyake-kKanal := 3 (Bildschirm)
LOA je)
STR 133 aktiver Eingake-Kzanal := 8 (Tastatur)
RTS
logisches File erceffren
LD* 184 Filenummer
BNE 82289 = a «nicht erlaukt!)”? Nein: weiter hei 82233
JIMF 63242 > IrQO-Error #&. "NOT INPUT FILE"
JSR 62223 > Filenummer in Takelle suchen
BNE 62297 gefunden?” Nein: weiter kei 62297
JMP 68632304 > Irü-Error #2. "FILE PEN"
LOS 152 Anzahl caffene Files
CPx #1a = 10 (maximale Anzahl>”
BCE 82306 Nein: weiter kei 823048
JMP 63227 > Trü-Error #1. "TOoG MANY FILES"
253
CcENM SI BRSIC VvZ = m - - Br ö pen I 2 I 4
OPEN, lIcwisches File eraeffnen (Fortsetzung?
s22306 INC 152 Anzahl offene Files um eins erhoehen
&223a3 LDA 1234 Filenummer hinter letzten Takelleneintrag
82310 STR sal.x in Takelle der Fileparsmeter zschreiken
822313 LDA 185
52315 ORA #96 Bit S und & der Sekundaeradresse setzen,
82317 5STRA 135 alz neue Sekundseradresse speichern
52319 STR S2z1l.® und in Tabelle bringen
S232E LOR 185 ebenso die Geraetenummer
522324 STA s1l.® in die Tabelle bringen
82327 BER 62419 Geraeterummer = A (Tastatur)? Ja: fertig
523293 CMP #23 = 3 ‘Bildschirm>?
52331 BEO 62419 Ja: weiter hei 62419
82333 BCC 62340 kleiner 3? Ixz: weiter kei 623944
82335 JI5SR 62421 > OPEN auf seriellen Bus ausaeben
52335 BCC 852419 Unkedinater Sprung zum Abschluss von OPEN
sz3da CMP #2 Gersetenrummer = 2 \RS-Z32 Kanal>?
52242 BNE 62347 Hein: weiter hei 62347
Bz3d44 TMP 624773 >= QPEN-Handlina fuer R5-232
s2347 ISR oO 5addf >» Feinter auf Cassettenpuffers nach (KR/TR)>
B2235a BIS 62355 Ist {&RrtR> kleiner 5127 Nein: weiter kei 523535
52352 IMP 583251 > Teü-Error #9, "ILLEGAL DEWYICE NUMBER"
52322 LOR 135 al:tuelle Sekundaer adresse
BEF3ST AND #12 Bit a kis Bit 3 isolieren
52359 EBENE 62392 Lesen „an Tape? Nein: weiter hei 582392
823651 ISR 0653511 = "PRESS FLRYT ON TRAPE"
22354 BCSOÄOB242a Rkkruch durch RUNSTOP? Tas RTS
BzREsS ISR 27082895 > Im Direktmadus "SEARCHING" und Filenamen ausgehen
52353 LOA 133 Lsense des Filensmens = 9?
S22371 BEQO 8623823 Ja: weiter bei 62383
582373 JI5SR 8634656 > Dateikopf mit ver langtem Namen suchen
Bares BCl 862402 Fehler? Nein: weiter hei 52402
52378 BEQO 229420 Akbruch durch RUNSTOF? Ias RTS
s2320a IMP 63236 >= I-O-Erraor #4, "FILE HOT FOUND"
823923 I5SR 6327E > Datenklack in Puffer lesen
523865 BEU 62420 "End af Tape” oder RIUNSTOP? Ta: RTS
52333 BCC 862402 Fehler” Nein: weiter bei 52402
22390 BES O2 62380 I-O-Error #3. "FILE NOT FOUND"
Die Eranches an den Adressen 8523385 und 582388 scallten
uchl eigentlich in umgekehrter Reihenfolge ztehen!>
52392 ISR 83544 > "PRESS RECÜRE % PLAY ON TAFE"
823933 BCS 2 862420 Abkruch durch RUNSTOP? Jas RTS
52337 LDA #4 Kennzeichnung fuer Dateikopf einer sequentiellen Datei
52393 ISR 63338 > Dateikopf in Tapekuffer erzeugen und auf Band schreiken.
82442 LDA #171 Kennzeichnung fuer "kein Zeichen im Puffer”
szd4a4 LDOY 185 aktuelle Sekundaeradresse
s24as CP'Y #96 = 96 “Lesen „on Cassette)’
2408 BER 652417 Ja: weiter kei &2417
sz4la LDY #a Index fuer erste Position des Cassettenpuffers.
e2412 LOA #2 Kennzeichnung fuer Datenblcack einer sequentiellen Datei
85244 STA 1’S>,Y in erste Pufferposition bringen
s2416 TYVA
e2417 5STA 166 Pufferzeiger festsetzen
a2ga413 CLC
52420 RTS
254
Ce ©: BRBRrR>S1lc zZ = = - - = RR nel
OPEN auf seriellen Bus ausgehen
s2421 LDR 185 sk:tuelle Sekundsaer adresse
82423 BMI 62419 kleiner 128? Neins fertig
52425 LO 133 Laenge des Filenamen=
82427 BEQ 62413 = 9? Ja: tertia
82429 LDA #0
52431 STA 1443 .- Status lcoeschen
852433 LDA 1235 Ger aetenummer-
82435 JISR 89694 > LISTEN
82433 LDA 135 aktuelle Sekundszeradresse
8244 OFR #240 Bit 4 ki=s Bit 7 setzen “Kennzeichnung Fuer OPEN)
82442 ISR 8609357 > SECOND. Ausaahbe Sekundaeracresse
E2445 LOR 144 Bit ” im Irü-Statuskute gesetzt?
62447 BPL A 62454 Nein: weiter kei 52däd4 |
82449 PLA Ruecksprungadresse scan Stack entfernen
8245A PLA
s2451 IMP 63239 > IüO-Errar #5, "DEWYICE NAT FRESEHT"
82454 LOA 133 Laenge des Filenamens
52458 BER 62470 = A? Ja: weiter kei S24rıa
562453 LO'Y #0 Index fuer Filenzmen
e2d4sa LOA 1STH,Y zeicheh zus Filenamen lesen
s2462 ISR 564393 > CIMWT, Zeichen auf seriellen Bus zusgeken
s2455 INT
B2d4oH CP'Tr 13% alle Zeichen ausgegeken”
824658 BNE 82484 Nein: weitermachen „...
gs2d4r7a IMF 4 Saas > UNLISTEN. Carrv loeschen. FRT5
OPEN fuer RS-Z22-Handlineg
5247”3 ISR 062595 > zaentliche NMIzs verhindern. RS-232 Il initialisieren
s2d4r’ö STYV 53 RS-232 .Status laoeschen
82479 CP'Yr 183 L.s3enye des Fiisenasmens
82431 BEO 624933 = a? Ja: weiter kei 5274323
82453 LOA IST) ,.T llekertrasung der ersten 4 Butes des Filenamens
82435 STA 59, in den Bereich 833,....B82)J
82498 INY
s2d4g3 CPY #4
82421 BNE 62479
82493 ISR 8512583 > Martliaerse fuer RS-Z232 Dateruekertraaung feststellen
52496 STX 8654 und in den Speicher fuer die Wartliaenge schreiken
82499 LODR 639 RS-2Z32 Kontrallregister
82502 AND #15 Bitz a kiszs 3 iscalieren (Kennzeichnung fuer die Baud-FRate)
82504 BEQO 62534 = fi (lLiser-Baud-Rate)>” la: weiter kei 5825934
82508 ASL Index fuer Takelle verdoppeln
82507 TRA% und als Index ins xR bringen
s2>sas LOA BY8 Fls94 fuer Quarzfrequenz «“NTSC=@a,. PAL=1>
82511 BNE 823522 = 1? Ja: weiter hei 67922
82513 LDY 6869217.8% Timer-Werte fuer die Baud-Rate aus
s2sile LOR 65216,.% NTSC-Takelle holen
82519 IMP 62528 > weiter bei 527528
52522 LOY 38603.8 Timer—-WMerte fuer die Baud-Rate zus
82525 LDA 593602,% PAL-Takelle holen
82528 STY 862 und nach (866176652) kringen
82531 STA 861.
82534 LORA 861
62537 ASL Timer-Wert in (661.662? verdoppeln,
82538 JISR 85326 > 200 addieren und nach 5696656) uekertragen
82541 LDRA sea RS-232 Kommandoresister
52544 LSR Handshalke-NMaode
582545 BCE 825356 8x-Line? Nein: weiter kei 62556
255
Cr &4+ BRSIcC W2Z - - ei - - - en
OPEN fuer RS-232-Handlina “Fortsetzung?
g2247 LOR 585377 Port E der NMI-CIR
82550 ASL Ist ’DSR IN” auf hish gesetzt?
82551 BCS 82556 Ja: weiter kei 62556
82553 JSR 61453 > "DSR Signal Missing”. RS-232 Status setzen
825585 LOA 887 Pointer auf Ende des Empfangspuffers
823533 STA 568 in Pointer zuf Anfang des Empfangspuffers uekertragen
525652 LDA E70 Pointer auf Ende des Sendepuffers
8276559 5TA 553 in Pointer auf Anfang des Sendepufferzs uekbertrasen
52588 ISE 65063 > MEMTOP, Speicherende lesen (sR/YR)>
82571 LDA 243 Hishhvte des Pcinters zauf den Empfanssputffer
82573 BNE 625804 = &?7 Nein: weiter hei 682530
82575 DE'Tr
525378 STr 248 255 Bvtes fuer den Empefansspuffer reservieren
82573 STX 2
52380 LOA 25a Hiyhkurte des Fointersz zuf den Sendepuffer
B25S2 BNE 62599 = 8? Nein: weiter kei 8525939
82334 DE’Y
62535 STr Fa 5 255 Brtes fuer den Sendepuffer reservieren
82597 ST# 243
52599 SEC Fehlerflag setzen
82590 LOA #240 Code fuer "Puffer schuetzen”’freigeben”., 91. 37233 +
52292 IM 890659 >
> MEMTOF,. Sreicherende festsetzen (RK “rR)
RS-232-1.0 imitialisieren"akkrechen
52395 LOA #127
S23537 STAA 555989 zsaemtliche NMI= Wausser RESTÜRE> klockieren
s2saa LDA #6
BeeaZ STA 3865979 Daten ichtungsregister
Szsaa STA 56857 und Port fuer RS-232-Handling initislisieren
52548 LORA #4
szeld ORA 36576
52513 STA 2 58978 "RS-232 QUT” zuf hiah setzen
szeile LOY #0
52613 STY 8723 RS-Z32-Reygister fuer aktive Interrupts auf null setzen
82521 RTS
LORD. Load und VYerifv von Froar ammen
BEeezE ISTA 133 Ainfangsadresse des Programms
s28524 STTr 196 falls RAPPEHND “z. B. zn Speicher anfang)
S26825 IMP 3185 Hormalwert des Yektors .3165.’8177: 826523
ez8293 STA 147 Flaa fuer LOAD a5 und YERIFY “1>
52831 LOA #0
B2E23 STA 144 Status laeschen
52837 LOR 125 Ger aetenummer
szeE37” BNE 82642 =a Tastatur)? Nein: weiter bei 82842
52639 IMP 63251 > ITü-Error #9. "ILLEGAL DEVICE NUMBER"
ezsdz2 CHF #3 =3 «Bildschirm>?
826544 BEQO 62639 Ja: IT-ü-Error #3, "ILLEGAL DEYICE NUMBER"
sze4&6 BCE 852771 kleiner 37 Ja: weiter bei 82771
8265453 LOY 1323 Laenge des Filenamens
s2&5540 BNE 82695 = 0? Nein: weiter bei 652653
S28552 IMP 63243 > LO-Erreor #3. "MISSING FILE NAME"
256
CE =©4 FEASIC zZ - - - - - - er te Das
LOAD, Load und Yerifv von Praarsmmern (Fartsetzung)
82555 LD8 185 Sekundseradresse ins XR retten
B2bSr7 ISR 62335 > Rusaake "SERFRCHING ",. estl. "FOR" mit Filenamer
Bes LOR #965
E26 2 STA 195 Sekundzeradresse zuf 95 (LORD vom seriellen Eus> setzen
827854 ISR 62421 OPEN auf seriellen Bu
in
az4ekern
828667 LDA 186 Ger zaetenummer in Accu
82669 JSR 860581 > TALK.
BS26 72 LORA 135 Sekundseradresse in Accu
82674 ISR 0 60871 > TKSA. Sekundseradreszse zuf Rus ausgeben
B26577 ISR 60947 > RCFPTR, Zeichen war Bus halen
s2850 STA 174 und in den Ladezeiwer 1lcuı krinsen
82682 LOR 144 10-Statuskute
82684 LSR
826585 LSR Zeitfehler keim Lesen”
E26 BES 862768 Ja: 1rO-Errar #4. "FILE NOT FOUND"
828588 ISR 64947 > RCPTR, Zeichen von Bus holen
82631 STA 175 und in den Lzdezeiger hiyah krinsen
52693 TARA Sekundsaeradresse kei Aufruf var "LORD"
82694 BNE 827a4 unaleich rull £EAkscalut-LOARD>? IJIz: weiter kei SZrYad
82898 LDA 195 ansonsten APFEND-Adresse kei Aufruf von "LORD"
826893 STA 174 in den Ladezeiger uekertraguen
szervaa LODA 136
52702 STR 175
szrad ISR 82930 > Aussgake "LORETNG" -"VYERIFYTING"
82707” LOA 4253 Bit 1 «“Zeitfehler heim Lesen)
s2r’a9 AND 144
s2y”11l STA 144 im Status loescher
e2713 ISR 65549 > STOP, Akfra9se der RUNSTAP-T==te
szril& BNE 62721 RUNSTOF sedrueckt? Nein: weiter hei BZr7rzl
s2r718 IMP 683027 > CLOSE zuf Bus zusaehen,. Flaa fuer Akkruch setzen
52721 JISR 60947 > REFTR, Zeichen vom Eus holen
BErz4 TAG und ins SFR retten
52725 LDRA 144 I7’Q-Statuskute
Ber’z2Y LSR
82728 LSR Bit 1 “Zeitfehler keim Lesen) sesetzt?
52729 BCS 6827407 Ja: nochmal probieren
52731 TARA gelesenes Zeichen wieder in Accu bringen
Ber’a2 LOY 147 Fls4 fuer "VERIFY’” gesetzt?
82’34 BEU 62748 Neins weiter kei 682748
g2r36 LDY #40 Index fuer Painter
82738 CMP 174) ,7 gelesenes Byte mit Buvte im Arkheitsspeicher veraleichen
52749 BEO 627509 Gleich?” Ja: weiter hei 62758
82r’42 LDA #1& Bit 4 fuer Nichtuekereinstimmung
e2r’d4d4 I5SR 65052 > Status setzen
82747” BIT N
82743 STA 1743 ,Y gelesenes Brte im Arbeitsspeicher aklesen
E27508 INC 11” Lesepcinter erhoehen
Bs2’Ya2 BNE 827585
82754 INC 175
82756 BIT 144 1/’0-Statuskute
627358 BVC 82707 Bit & «End ar Indentifv> gesetzt? Nein: weiterlesen ...
sersi ISR 80911 > UNTALK
527653 ISR 853042 > ELOSE auf seriellen Bus zusyeken
B2r76&6 BEC 62839 Fehler?” Nein: weiter kei 528333
ES27ER JIMP 63236 > Trü-Error #4. "FILE NOT FOUND"
82771 LSR Bit & der Geraetenummer in die Carrv-Flas schieben
Ber’T’2 BCS 62777 "LORD" warn Recorder?” Ja: weiter kei 82777
g2r7’4 JIMP 63251 > T7/O-Error #9, "ILLEGAL DEVICE NUMBER"
257
CE 8&©+ BHRSICc zZ eu - = = = - a7 7r
LORD. Load und Yerifv von Programmen (Fortsetzung?
52777 JSR 63440 > Peirter uf Cassettenpuffer nach \KRTR>
s27’sa BCS 62785 Ist £KkRYR> kleiner 5127 Nein: weiter kei 62785
s2782 IMP 653251 >» I/G-Error #9. "ILLEGAL DEYICE NUMBER"
82785 ISR 63511 > "PRESS PLAY ON TAPE"
82738 BCS 62394 Rebkruch durch RUNSTOP? Ia:s FRTS
g2zr’a0 ISR 82895 > Im Direktmodus "SERRCHING " und Filenamen ausgeben
52793 LDA 183 Lsense des Filenamens
n27Y35 BED 862845 = 87 la: weiter bei 62586
82797 ISR 63466 > Dateikopf mit verlangten Namen suchen
s2sua BCl 62313 Fehler” Nein: weiter hei 652813
gsz802 BEQ 82894 Akbruch durch RUNSTOP? JIas RTS
s28a4 BCS 52768 I-Q-Error #4. "FILE NOT FOUND"
8sz8as ISR 63276 > Dateikopf in Puffer lesen
523093 BER 62394 RUNSTOP oder "End of Tape”? Ia: RTS (val. 623933 #5
g>811 BCS 82768 I-O-Error #4. "FILE HOT FOUND"
82351232 LDA 144 1.0-Statuskute
52815 AND #15 Bit 4 “Lesefehler)> izscalieren
62817” SEC | Flaa fuer Fehler setzen
52818 BHE 528394 Rit 4 wvesetzt” Ta: RTS
82820 CPX #1 PRelsati.prosramm meist BASIC»?
52322 BEU 829341 Ja: weiter hei 62941
52824 CP# #3 Aksolutpr aan amm Ckein RFFENOD ar Speicherantfang! >?
B2S26 BNE 62793 Hein: weiterzuchen „..
82323 LDY #1
82830 LORA 173) ,.Y7 Startsdresse zus Caszsettenpuffer
52332 5STA 135 in Ladezeiger kringen
528534 INY
82335 LOA 178) .Y
82237 STA 1985
5252393 BCS 62945 Inkedingter Sprung
52541 LOA 135 Sekundsaeradresse = 8 \APFEND>T
8238423 EBENE 582828 Hein: weiter hei 582828
528453 LDYr #3
52547 LDA 173) .Y7 Endadresse+1 1lou des Prour amımz
82349 LO #1
52531 5BC 1752 ninus Startadresse \l\cw des Prour amms
828333 TA
52854 LD'Y #4
82558 LDA .1783>,Y ekensc hiah
523853 LOD’Y #2
52860 SBC 1793 ,.Y eraikt Laerwe des Prosur amms
82382 TAY
823853 CLC
82864 TA Proar ammlaenge zur
52885 ADC 195 RPPEND-ARdresse kei Rufruf von LORD” addieren,
82857 STA 1vY4 erqgikt die eigentliche Startadresse bei LOAD oder YVERIF'’Y
82859 TYA i
82870 ADC 196&
52372 5STA 175
82874 LDR 195 .1935.’1965 nach 1923194) vekertragen “LawWlezeiser >
82876 5TA 133
82878 LODRA 196&
s2880 STA 194
82882 ISR 8629309 > Rusgake "LORDING" kzw. "WYERIFYING"
82885 JSR 83362 > Proaramm einlesen
82888 BIT Fa
82883 CLC
258
Br 254 BRSIC zZ - - = - - - Segen
LORD. Laad und YVerifyv von Frogrammen “Fortsetzung?
8285980 LOS 174 Endadresse+i1 des gelesenen Prour amms
82892 LDY 1759 nach ÜXSRerR> uebertrasern
82894 RTS
Im Direktmodus Ausgake "SERRCHING " und ewti. "FOR " mit Filenamen
82895 LOR 137 Rusaake unterdruecken (Direktmadus??
82537 BPL 852929 Jar RTS
829393 LDY #12 Offset fuer "SERRCHING "
82301 ISR 61743 > Meldung drucken
s29a4 LOA 183 Laense des Filenamens
s290& BEQ 52929 = a? Iza: RTS
829RAS LDY #23 Offset fuer "FOR "
s2s1A ISR 61743 > Meldung drucken
82912 LDY 1:3 Laernge des Filenamens
82915 BED 52923 = A? Ia: RTS
82917 LO'T #4 Index fuer Filenamen auf mull setzen
829319 LDA 187) .T eeichen aus Filensamen lesen
82921 JITSR 865490 > CHRQLT, Zeichen im Accu ausgeben
62924 INY
62925 CPY 133 alle Zeichen ausgesehen?
82927 BNE 623193 Nein: weitermachen „..
8629293 RTS
ARusazake van "LORDING" kzwu. "YVERIFTING"
529390 LOY #73 Offset fuer "LORDING"
s2arz LOA 14” Flau fuer "VYERIFY”" gesetzt?
829234 BED 6529338 Nein: weiter kei 62938
8239385 LEW #33 Offset fuer "WVERIFYTING"
52935 IMfF 6861739 > Meldung ausgehen
SAYE. Speichern var Frour ammen
52341 ST 174 Endadresse Jde=z Programms nach «1741755
52943 STTr 172
82345 TA Wert im Accu entspricht Offset fuer Endpcinter
s22d4s LOR As Startadresse lcouı aus Pcinter
62943 STA 193 nach «19395
62950 LODR 1.8 und Startadresse hiah
B29a22 STA 124 nach „1945 vekertrasen
&2354 IMP S15> Normalwert des "Yektars (313.’31MN: 862957
52957 LOA 185 Ger aetenummer
52933 BNE 82964 = 8 (Tastatur)? Nein: weiter kei 629684
829681 IMP 65251 > 1eQü-Error #3, "ILLEGAL DEVICE NUMBER"
8239684 CMP #3 Gerzetenummer = 3 (Bildschirm>?
s2ass BEU 62961 Ja: 1“0-Errar #9, "ILLEGAL DEYICE NUMBER"
82963 BCC 853955 Geraetenummer kleiner 37 Ia: weiter kei 530695
szar7a LOR 497
82972 STR 185 Sekundaerfadresse auf 37 XSRAYVE auf seriellen Bus) setzen.
82974 LOT 183 Laenge des Filenamens = 8?
82976 BNE 862981 Neins weiter kei 62981
SZ9r7S IMP 863248 > IO-Error #8, "MISSING FILE NAME"
629981 ISR 82421 > OPEN zuf seriellen Bus ausgeben
52994 ISR &2>119 > Ausgabe "SAYING " und Filenamnen
82987 LORA 155 Ger setenummer
82933 IJISR 2 606594 > LISTEN
82932 LDA 185 aktuelle Sekundaer adresse
62994 JSR 60857 > SECOND, Rusgake Sekundsaeradresse
259
CO eBr
SRAWYE,
52997
62399
53002
sad
53007
52009
53012
53015
53417
53419
53022
53025
53048 .
Selstep
5353
530535
53937
SIaEm ,
Leyen le)
s3a64
Gh nah dhnhnnh hm
DIGITAL
= am AMAMSAM AU EM
DW 19 a 1 Ban Ta Br ET Tre Kr a a Oo N a
Na EN SAT er Bn
er EeShnzıcl zZ - - - - = -
Speichern „von Prosrammen (Fortsetzung)
LD'Y
JSR
LODA
JSR
LOA
JSR
ISR
BCS
LDA
JSR
JSR
BNE
#40
54.398
172
54393
173
80393
54721
53439
„172>,Y
50893
55595
53034
185
ayel = T=Sc
136
sasS4
1853
#239
#224
50357
Sa92E
dh MM
[U Y Ya
- N m 1)
“ER De
mine nö
Ti
71)
kumh
> Programmstartadresse nach (1727173) <Transportzeiger)
Startadresse low
> CIOUT, Zeichen ausgeken
Startadresse high
> CIQOUT, Zeichen ausgeben
> Pruefung, ok Ende erreicht?
Alle Bytes ausgegeben? Ja: weiter kei 63039
Zeichen aus Speicher lesen
> CIOUT, Zeichen ausgeken
> STOP, RUNSTOP-Taste abfragen
RUNSTOP sedrueckt? Nein: weiter kei 863034
> CLOSE auf seriellen Bus ausgeben
Fehlercode Null fuer Akkbruch durch RUNSTOP
Fehlerflag setzen i
> Transportzeiger erhaehen
Bei ncarmalem Gekrauch unkedingater Sprung
> UNLISTEN
seriellen Bus ausgeben
aktuelle Sekundaeradresse
kleiner 128? Neins fertig
Ger s32etenummer
> LISTEN
aktuelle Sekundaer adresse
Bit 4 loeschen
Bit I kis 7 setzen “Kennzeichnung fuer CLOSE>
> SECOND, Ausgabe Sekundseradresse
> UNLISTEN
Bit a der Geraetenummer in die Carrv-Fla9 schieben
ARusyake auf Recorder”? Ja: weiter bei 63471
> 1Trü-Error #93, "ILLEGAL DEWICE NUMBER"
> Feinter auf Cassettenpuffer nach CXR’YR)>
Ist (KR/YR> kleiner 5127 Ja: 1/O-Erraor #9
= "PRESS RECORO & PLAY ON TAPE"
ARkkruch durch RUNSTOF? Tas RTS
> Ruszsgake "SAYING " und Filernamen
Kennzeichnung fuer Akbszscalutprcaar amm
=ktuelle Sekundsaeradresse
Ist Bit ü gesetzt”
Ta: weiter kei 820934
Kennzeichnung fuer Rel=ativpraur amm
>= Dateikopf in Puffer erzeugen und auf Band schreiben
Fehler? Ta: RTS
= Froaranım auf Band schreiken
Fehler” Ia: RT
al:tuelle Sekundaer adresse
Ist Bit i wesetzt?
Hein: fertia
260
C-RBri
S+ EernsıIc W2Z - - - - - -
SAYE, Speichern „van Programmen (Fartsetzung)d
53111 LDRA
63113 ISR
53116 BIT
523117 CLC
83118 RTS
Ausgake san
83119 LDR
83121 BPL
83123 LD'Y
53125 JISR
53129 JMP
UDTIM,. interne Uhr um
83131 LOX
83133 INC
63135 BNE
63137 INC
63139 BNE
83141 INC
63143 SEC
3144 LDA
63146 SBC
83148 LOA
83158 SBC
3152 LDA
53154 SBC
83136 BCC
53158 STE
s318a STE
53162 ST®
Flaa fuer
523164 LOR
83167 CHP
s31r’a BNE
5>317’Y2 TRAs
52173 BMI
83175 LDE
53177 ST“
s>1sa LO“
83133 CP
863138 BNE
531323 STAR
583191 IN“
83192 BNE
83134 STA
83195 RTS
RCETIM. Uhrzeit lesen
” SEI
23 LORA
a LEW
& LE
#2
53333
"SAYING
157
83118
#0
162
63143
161
53143
180
162
#1
151
#26
160
#79
SCH?
150
161
182
Ss321l
S6321
53164
u ag
Th ih Oi
ca ee)
Kennzeichnung fuer "End Of Tape’-Block
> EOT-Block erzeugen und auf Band schreiken
und Filenamen
Rusgake unterdruecken (Direktmodus??
Tas RTS
Offset fuer "SRAYING "
> Meldung ausgeken
> Filenamen ausgeben
eire Sfstel Sekunde weitersetzern
LSB erhoehen
MSB erhoehen
mamentane Uhrzeit in 6SQ@stel Sekunden
mit 24 Stunden (6s@stel-Sekunden-Darstellung? vergleichen
24 Stunden erreicht? Nein: weiter bei &3164
alle Stellen lceschen
diverse Tasten "zur RUNSTOP-Abfrzae)> aktuzlisieren
Tastaturdecoder ausq3an9
zum Entprellen nach eirmal akfragen
RUNSTOF gedrueckt?
Nein: weiter kei 63194
BRitmuster zur Akfrage der Reihen mit den Shift-Tasten
Tzsetaturreihenausgang fertsetzen
Tastaturdecoder ausaarg
zum Entprellen nach einmal akfragen
Her in keiner der beiden akaefraasten Reihen eine Taste
Yedrueckt speziell Shift??? Nein: kein RUNSTOP
Fla4s fuer diverse Tasten setzen
261
>23111
CB S5=+ BRSIC zZ - - - - “
SETTIM,
532064
53205
83207
63209
83211
EI2l2
STOP:
83213
83215
63217
53219
632208
63223
53225
63226
1.Q-Error-Handling,
53227
853223
653230
53232
53233
83235
532365
853238
632397
83241
83242
3244
63245
63247
683248
53250
53251
653253
53254
3297
63239
53261
SI2Er
53285
53267
632683
83274
63273
53274
5.3275
ser lanaten
83275
53278
63279
83282
63283
63285
SEI
STAA
sts
STYr
CcLI
RTS
182
161
159
Uhrzeit setzen
Abfrage der RUNSTOP-Taste
LDRA
CMP
BNE
PHP
JSR
sSTA
PLP
RTS
LDA
BIT
LOA
BIT
LDRA
BIT
LDA
BIT
LOA
LDA
PHR
JSR
PLA
STR
BCS
1453
#127
53226
55434
193
#1
#2
#3
Flas3 fuer diverse Taster
RUNSTOP alleine) sedrueckt?
Nein: RTS
Statusflagygs fuer spaetere Akfrage merken
I/0O-Kansele schliessen
> CLRCHN, aktive
Tastaturpufferindex loeschen
Statusfla93s5 wiederherstellen
Einsprunastellen fuer Errors
TOO MAN'Y FILES
FILE OPEN
FILE NOT OPEN
FILE NOT FOUHO
DEVICE NOT PRESENT
NOT INPUT FILE
NOT OUTPUT FILE
MISSING FILE NAME
ILLEGAL DEYICE NUMBER
> CLFECHN. aktive I7/0-Kanzele schliessen
Offset fuer "I-O ERROR #'
Ausazbke der 1.0-Errers unterdruecken?
Ja: weiter bei 63273
> Melduna drucker
Fehlercode halen
und fuer spaetere Verwendung wieder auf
in ASCIIT umwandeln
> CHROUT, Zeichen im Accu drucker
Fehlercade wiederherstellen
Fehlerfl=ay4 setzen
Dateikopf van Band in Puffer lesen
Flay fuer "YERIFr”
auf Stack retten
> Black won Band in Puffer lesen
Flzaa fuer "VERIF'Y”
Fehler beim Lesen?
wiederherstellen
Ia: RETS
262
Stack
legen
C CErl ©+ ERHMS>SIcl zZ - - - - - - 327
nerlangaten Dateikopf von Band in Puffer lesen (Fortsetzung?
53287 LDY #0
83289 LDA 178) ,'Yr erstes Zeichen im Cassettenpuffer
53291 CMP #5 = 5 (End coaf Tape»)?
83293 BEQ 83337 Jaı RTS
83295 CMP #1 = 1 (Relsativuprosramm, meist ERSIC)T
83297 BEQ 83307 Jar weiter kei 63307
683299 CHMP #3 = 3 (Akscalutproauramm, kein RAPPEND an Speicheranfana!>
83301 BEQ 83307 Jz: weiter hei 683307
83303 CMP 44 = 4 “Kennzeichnung fuer Startklack eines Ostenfiles>
83345 BNE 63276 Nein: weitersuchen. zurueck nach 683276
83307 TAX Kennzeichnung merken
63308 BIT 157 Rusaske unterdruecken (Direktmadus)>”7
833180 BPL_ 83335 Ja: weiter kei 633373
83312 LDY #939 Oftfsetpointer fuer "FOUNE "
863314 ISR 81743 > Meldung zusgeker
63317 LDY #5 Index fuer Filenamer
863319 LDA 179) ,Y Zeichen aus Cassettenpuffer lesen
863321 JSR 65490 > CHRQOUT. Zeichen ausgeken
83324 INY Index erhcehen
83325 CPY #21 alle 16 Zeichen des Filenamens auswemehen”?
63327 BNE 533193 Nein: weitermachen „..
83329 LDA 161 mittleres Byte der internen Uhr
63331 JSR 58592 > warten. bis Zeit vorkei ader Taste wedrueckt
63334 NOP
83335 CLC
83336 DE'Y
63337 RTS
Dateikopf erzeusen und auf Band schreiken
833383 STA 158 Kennzeichnung fuer Dateitvp merken
83348 JISR 63440 > Pointer auf Cassettenpuffer nach U&R-rR)
83343 BCLC 6863439 Ist (SPRTR) kleiner 5127 Ta: FTS
63345 LDA 194 Startadresse hiah.-
63347 PHR
63348 LDA 193 Startadresse lau.
83350 PHA
683351 LDA 175 Endadresse high.
63353 PHR
83354 LDA 174 Endadresse l\cu auf den Stack lesen
63356 PHRA
63357 LDYV #191 Lsenge des Lassettenputffers — 1
83359 LDR #32 Code fuer "SPACE"
83361 STA 178) .Y Cassettenpuffer mit Sraces fuellenr
83353 DEY
63364 BNE 63361
63366 LDA 158 Kennzeichnung fuer ODzteitvp
63368 STA 173) ,'Y in erste Fufferposition schreikenr
6337 INY
63371 LDA 193 ebenso die Startadresse
83373 STAA 1737,Y
63375 INY
63376 LDRA 194
63378 STA 178) .Y
63388 INY
63381 LDR 174 und die Endadresse
63383 STR 1785 ,Y
63385 INY
63386 LDA 173
63388 STR (178) ,Y
63398 INY
263
T-ERri
Dateikopf erzeugen und suf Band schreiben
53371
53393
53395
53397
83339
5a
52403
53405
53447
55449
53411
53413
534172
53418
s34Z2a
53422
53425
53426
53427
53427
53430
53432
53433
53435
5234236
53439
53439
2344
53442
53444
5344e
nn hand
I u Pa Buy u 7 Due Yu Fa Du ve u Sa u Va Bu Fa Be N
BEL LELRLLLLLH
u rs Be A ı a a rd u
DR ı ER u ZH u Bu 0 Bar Ku SS A Be
SAL LRLLLLL
DI Te aa 0 En Er Dr)
DI I I
IR U Bun Bar | BEI En Zu Eee Ba Bay BE ZEN Er
Pet
aa
ANANHTANAnAN
ab
wa
+ PER=ZIc
STr
LD'Y
sTYr
LDY
CPY
BEQ
LOA
LD'Y
STR
INC
INC
BNE
JSR
LOA
STR
ISR
TA'Y
PLA
STA
PLA
STA
PLA
STA
PLA
STA
TrA
RTS
LO“
LDY
CPY
RTS
ISR
TARA
STA
CLC
139
40
158
133
183
524153
1877 .YT
159
2178
I.,YV
: bestimmter
Filenamen
>2329>1
Fortsetzung?
Speicher fuer Index auf Filenamen im Cassetternpuffer
Pointer auf Filenamen festlegen
MHurden alle Zeichen des Filenzamens
in den Cassettenpuffer uekertr agen?
Ja: weiter bei 683415
Zeichen aus Filensmen
in Cassettenpuffer uekertragen
Pointer =zuf Filenamen erhoehen
Pcinter zuf Filensmen im Cassettenpuffer erhoehen
Inbedingter Sprung zum Schleifenanfang
> Start- und Endadresse des Cassettenpuffers festlegen
Dauer des Header-Sianals festlegen
> Cassettenpuffer auf Band schreiken
entuellen Fehlerccade im YR aufkewahren
Endadresse low.
Endadresse hiah,.
Startadresse cu.
Start=adresse hiah wieder vom Stack holen
enentuellen Fehlerccade wiederherstellen
Pointer zuf Startadresse des Cassettenpuffers
nach SHRTR> vebertraser
und »eraleichen. ok (KkF’yYR) kleiner 512
„> Startadresse des Cassettenpuffers nach (XR’YR>
und mach 2%1932.”1945 speichern
zur Startadresse 192 addieren,
erasikt Endadresse+l des Cassettenpuffers
Endadresse des Lassettenpuffers nach (174/175 bringen
zuchenr
> Black in Puffer "FOUNE " und Filenamen
Akkruch? Im: RTS
lesen. ARusaake
Index fuer selesenen Filenamen
Index fuer “wesuchten Filename
mit Laerse des Yesuchten Filenzamen veruleichen
alle Einzelzeichen bereits werslichen? Izı fertig
Zeichen zus wesuchtem Filenamen
mit Zeichen zus gesuchtem Filenamen »eraleichen
identisch” Nein: naechsten Block lesen
264
und = 17
Block
63491
63493
63495
53497
53499
653504
63501
83544
63586
63398
83510
ARusgake
63511
83514
83518
835193
83521
83324
83527
653529
63531
PLAY-Taste
63534
63536
83338
63548
63542
63543
Ausgabe
83544
6334
83570
63572
63574
63376
63578
63539
835352
63594
53386
SS: FSH>SlIc
mit bestimmten
INC.
INC
LDY
BNE
CLC
RTS
JSR
INC
LDY
CPY
RTS
ISR
BEO
LD'Y
JSR
JSR
JSR
BNE
LD'Y
JMP
LDA
BIT
BNE
BIT
CLC
RTS
JSR
BEO
LD'Y
BNE
. LG
LOAR
STR
STA
ISR
JSR
BCS
SEI
LOR
STA
STA
STR
sta
STA
STR
LOA
LDX
BHE
158
159
133
63479
53444
186
1686
#192
63534
53542
#27
81743
53596
83534
83521
#106
51743
akfra9ger
#16
1
653542
1
"PRESS RECORD
83534
83242
#45
63218
Band im
'— [5 = = = = =
Filensmen suchen (Fortsetzung?
ansonsten Indexpcinter erhoehen
und die Filenamen weiter miteinander »erqgleichen
> Pointer zuf Cassettenpuffer nach “KR TrR> kringen
Pointer auf Cassettenpuffer “Zeichenrzeiger> erhoehen
Ende des Czassettenpuffers erreicht. alle Zeichen welesen”
"PRESS PLAY ON TAPE": warten, kis PLAY-T=aste gedrueckt
> Pruefen, ck PLAYT-Taste gedrueckt
PLAY-Taste gedrueckt? Ja: fertia
Offset fuer "PRESS PLAY ON TRAPE"
> Meldung ausgeken
> kei RUNSTOF Rueckkehr zur vekeraeordnreten Routine
> Pruefen. ck PLAY-Ta=ste sedrueckt
PLAY-Taste Jedrueckt? Nein: zurueck nach 863521
Offset fuer "OK"
> Meldung ausgeken
P2
Maske fuer Bit 4 (PLAY-Taste)
Port akfrasen
PLAY-Taste gedrueckt” Nein: weiter kei 68354
Port nccheinmz=l akfragen zum Entprellen
Pr)
& PLA’Y ON TRAPE": warten. kis PLAYT-Taste Yedrueckt
> Pruefen, ak PLAT-Taste gedrueckt
PLAY-Taste gedrueckt? Ia:r fertig
Offset fuer "PRESS RECORD & PLAY ON TAPE"
Inkedingater Sprung
Puffer lesen
1.’0-Statusbute und
Yerifv-Flaga ruecksetzen
> Sstart- und Endadresse fuer Recaorderpuffer festsetzen
= "FRESS PLATF OH TAFE"
Rekruch durch RUNSTOFT? Iz2: weiter kei 837423
Interrupt „verhindern
Lesefla4 := Aktastung
Fla4 fuer Timerfl Read)
Timing-Koanstante
Korrekturzaehler fuer Fass
Korrekturzaehler fuer Fas
Flza fuer "Brte empfangen” ryuecksetzen
Bit 4 Ümeaative Flanke auf FLAG»
üffset fuer Tape-Read E37
Unkedinater Sprung
‚= Jdizsakled
ı Ar
Dom
Sl]
265
br ©Sı+ı PRrhzlic V2Z u Mr = - u m 235323
Block „von Puffer auf Band schreiken
533988 ISR 523447 > Start- und Endadresse fuer Recarderpuffer festsetzen
83531 LDA 420
83393 STA 171 LaerYge des Header=s var Write auf Cassette
83595 ISR 63544 > "PRESS RECORD & PLAY ON TAPE"
83598 BCS 63708 Akkruch durch RUNSTOP? Jar meiter kei 63798
83600 SEI Interrupt verhindern
s8I6A1l LOA #130 Bit Z “Timeaut von TimerB>
s3E03 LD #2 Offset fuer Tape-Write (645618?)
83805 LOY #127
836807 ST? 565333 alle IR@Qs sperren
83510 STAR 368333 entsprechenden IRQ fuer Schreiben’Lesen freigeben
83513 LOA 36334 Contrcal Resister A
E3&15 ORA #253 Bits 5 (Timer laden). 4 (One-Shot)> und a <Start) setzen
36138 STAR 365339 und wieder abspeichern
B3621 AND 41493 Bitkombkination fuer CRA fuer Neustart
53823 STR Er nach “&74> kringen “wird in 63761 wieder gelesen?
E36265 JTSR 81604 > warten, bis RS-232 Datenuebertragung akgeschlossen ist
&E36529 LOAR 53265 Register #17 des Yideo-Chips .
83832 AND #239 Bit 4 fuer BLANK SCREEN loeschen und wieder skspeichern
83534 STAA 532653 daher keine Bildschirmausgakbe waehrend Tape-l1’0>
53637 LDA 88 momentanen IRQ-Vektar in (78987739) nach (86717672) retten
szäda STR sr1
53643 LDA 39
EIS4& STA g72
836543 ISR 84701 >= IRQO-Vektor setzen
83652 LDA #2
B83634 STA 194 Anzahl noch zu: schreibende”’lesende Blacks festsetzen
83556 ISR 84407 > Tape-Initisalisierung,. Flaas und Zaehler setzen
535593 LDA 1
536561 AND #31
536853 STA 1 Reccerdermatcor einschalten
s3682 STA 192 Flz4 fuer Recaorderkantrolle setzen
83667 LD% #255
8365653 LDY 42535
83671 DET
BE3672 BNE 636571
3674 DES
53575 BNE 365659
Ss6r”r CLI Interrupt (Pead’bhrite fuer Cassette) freigeben
SI36r’E# LDA Sr’2 Yeretteter IRQO-Vektor high identisch mit momentanem
s3681 CMP 789 IERG-Vektor hiah Lalsc alles weschrieben.gelesen??
53584 CLC Fehler fla4 loeschen
825935 BEU 837ra8 Jar fertig
B3687 ISR 52695 > RUNSTOP-Taste abfragen
S3E3R ISR 9 83164 = Fl=24 fuer diverse Tasten (RUNSTOP> aktualisieren
53633 IMPF 63675 > und weitermachen ...
E236535 ISE 068570995 > STOP. prueft RUNSTOF-Taste
535839 CLC Fehler fl=a4 loeschen
azsvaa BNE 837123 RUNSTOF-Taste gedrueckt? Neins RTS
sI3rua2 JISR 64659 > Ende Recorder-I.’ü
53745 SEC Fehlerfl=2g9 setzen
52725 FLR Ruechsprunasdresse „om Stack entfernen
BEra7 PIA
e3raS LDA #0 Dn.aode fuer Akkruch
s3rı1a STA S7E geretteten IRO-Vekteor hHiah auf null setzen
53712 RTS
266
CB 5:4 RZASICclc zZ - - - - - =
=2714
Lassettensvnchronisstion vorbereiten
83714
63716
63718
63719
Interrupt-Rautine
De
Bag Bu [BEL Eur a Be DE ER SE 5
sT#
LDA
ASL
ASL
CLC
AROC
CLC
ADC
STR
LDA
BIT
Bl
ROL
ASL
ROL
ASL
FOL
TAX
LDR
CMP
BCC
ADC
STR
TAA
ADC
STA
LOR
STA
STA
LOA
ANDI
BEQ
LOA
177
175
sR nach £K17r7Y> speichern
Timina-Kanstante
mal 4
rlus Timimna-Konstante, a1l20o mal 9
plus (177)
und wieder dart ablesen
Accu enthaelt Hiahkute fuer Initialisierung von TimerA
Ist (176> groesser 1277?
Ja: weiter hei 63733
Carrv in untere Bitpcsition des Accus schieben
Wert zur Initi=elisierung von Timer vervwierfachen
Hiahkvte merken
Ist TimerB low
kleiner 22 “alsc Yersenderung »an TimerB hiah kis 63755)
Ja: Zurueck nach 63742
Laukwete fuer Initialisierung addieren
in Timer law vekertr augen
Hiahkbwrte fuer Initisalisierung
zu TimerB hiyh addieren
und in Timer hiah schreiker
Timer starten
Fls4 fuer "Timerfi akgelwufen” ruecksetzen
Interrupt Cantrcil Resister
negative Flanke auf FLRG (Tape-Read)?
Nein: weiter kei 637865
Adresse 83785 zuf Stack legen
> Interruptaufruf zsimulierenr:
Lesen son Band
TimerE hiah Caunter
TimerB lau Counter vom Wert 2359 zeuktr-ahieren
Iet TimerB hiah Caunter seit 6537593 vermindert worden?
Ja: zurueck nach 63788 =
TimerE hiah Counter nach (177) speichern
„verazngene Zeit low seit letzter Flanke ins <R
Latch von TimerB mit Masimalwert (655359 »vorbelegen
Arbeitsmoadus fuer TimerB festsetzen und TimerB starten
Wert des Interrurt Control Reaisters (Interrupt Flags?
nach 18755 vekertrauen
TimerB hiah Counter vom Wert 255 zubtrahieren
Errechnung vergangene Zeit hiah seit letzter Flanke?
vergangene Zeit lcou nach (177) speichern
267
CC Br
SI PeRHRSICc
Interrupt-Routine zum Lesen von Band “Fortsetzung?
53827
63328
63838
63331
83333
63335
63336
63838
53348
63342
638344
639846
653349
653851
653353
63355
63857
53359
638361
653963
63364
63866
63868
633708
83872
539374
63876
683378
533830
653383
53885
653837
63389
63591
53393
63395
63897
63398
639008
63992
63994
63996
63908
83918
63912
63914
63916
63918
63928
63923
63925
63927
63939
63932
63934
63936
LSR
ROR
LSR
ROR
LDA
CLC
ADC
CMP
BCS
LDS
BEQ
JMP
LDX
BMI
LDS
ADC
RDC
CMP
BCS
INx
ADC
Rccu enthaelt vergargere Zeit hiah)
vergangene Zeit durch 4 dividieren
Ist Timings-kKanstante
plus sa
groesser als die Zeit seit letzter Flanke?
Ja: keine Informationen, weiter bei 63918
Brte empfangen?
Neins weiter bei 63849
> ansonsten weiter kei 864496
Brte vollstaendig yelesen?
Ja: weiter bei 63884
Wert fuer kurzen Impuls
Rcecu fuer Akfr=zge festsetzen
Wurde, kurzer Impuls empfangen?
Jar weiter bei 83891
Wert fuer langen Impuls
Recu fuer Abfrage festsetzen
Wurde langer Impuls empfangen?
Jas weiter bei 63895
Ist Vveraangerne Zeit noch 1l=serser
Nein: weiter bei 53383
> empfangenes Byte verzarkeiten
TimerA freigegeben?
Neins weiter hei &8391&
Fla4 fuer =
"Read Error” zetzer
Unbedingter Sprung
Fils43 fuer Impulslaengerwechsel erhoeher:
Unkedinster Sprung
Flas fuer Impulsisengermechsel vermindern
nom Abfrageuwert
19 scwie die »veraangere Zeit suktrahierern
und zu Karrekturflas addieren
Korrekturflaas fuer Timings-Kanstanıte festsetzen
Fla9g3 fuer Empfang beider Impulse
invertieren
und wieder abspeichern
Beide Impuls emprfanaen? Ia: weiter hei
empfangenes Sigrızal speichern
Timer freigegeben”
Nein: Interrupt =skschliessenr
Wert des Interrurt Control Registers siehe 53816)
erfolste Aufruf der Leserautine durch TimerA-Interrurt”
Ja: weiter bei 639732
TimerA akselaufen?
Nein: Interrupt abschliessen
Flag fuer Impulszaehlungyg loeschen
Fl2439 fuer "Timecaut Timer” setzen
268
Buvrte-Header)”
(EBr1
SI FSHz=SIc zZ - - - - - -
Interrupt-Routine zum Lesen von Band (Fortsetzung)
83939
53941
583943
53945
53947
53958
63952
63954
63337
53359
63961
63963
529655
583966
653963
53970
53972
839774
53976
83977
523979
83781
639833
539935
53937
63989
53991
539392
53934
53998
563398
san
san
s4aag
stage
4a
54010
54013
Saale
= Ic 5 En
at Tu Pad
LOR
BPL
BMI
LD*S
ISR
LDRA
BNE
JMP
LOA
BEO
BMI
DEC
BIT
INC
LDA
STR
CPX
BNE
TA
BNE
LDR
BMI
CMP
BCC
STA
BCS
TARA
EOR
sta
LOA
BEQO
DEC
EMI
LSR
FOR
LEN
JSR
JMPF
LOR
BEQ
LOR
BEU
LOR
25 EMI
IMP
LSF
LDA
SEC
SBC
ROC
RSL
TAr
SR
INT
IRA
EHE
1&3
63931
533308
#166
sid
155
53883
55212
146
539683
E396&
176
176
40
146
215
83991
633893
Byte „aoallstaendig gelesen?
Neins weiter bei 63991
ansonsten weiter hei 63884
Hert fuer Initi=slisierung von TimerRA
> Timing initialisieren
Register fuer Parityvkit
Ungleich null? Jas Paritv Error, weiter kei 63383
> Interrupt sbschliessen
Korrekturflag fuer Timina-Konstante
= 80? Ja: weiter kei 639683
kleiner null? Tas weiter hei 863966
Timing-Konstante vermindern
Timing-kKanstanrte erhcehen
Korrekturflag fuer Timing-Konstante loeschen
Mert des empfangenen Impulses mit vorherigem vergleichen
Insleich? JIas alles in Ordnung, weiter bei 63931
warde kurzer Impuls empfangen?
Neins Lesefehler, weiter bei 63383
Flsa fuer Impulslaengenwechsel
negative Werte wegen des folgenden Compares abfangen
Murden 16 aufeinanderfolgende kurze Impulse empfangen”?
Nein: weiter kei 633185
ansonsten Flasa fuer "’EOB empfangen’ setzen
Unkedingter Sprung
empfangenes Bit
mit Inhalt des FKeygisters fuer das Parityvkit verknuepfen
und dort wieder akzspeichern
Timer freigeseken?
Nein: Interrupt abschliessen
Bitzaehler vermindern
Paritvkit empfzrngen? Ta: weiter bei 63945
ansonsten gelesernes Bit
in serielles Shift-Register fuer empfangenes Brte kringen
Wert fuer Initialisierung von TimerA
> Timing initisalisieren
-
= Interrupt skschliessen
Murde EOB empfansen?
Nein: weiter bei 64024
TimerA freigegeken”
Nein: weiter kei 84031
Ist laufender RBitzaehler
neqati,? Ta: weiter kei 84431
> kein Bute-Header zu erwarten, lanaen Impuls verarbeiten
„er ganmene Leit seit letzter negativer Flanke halbieren
umd won 147 zuktrahieren
Plus der Timina-kKaoanstanten
Erseknis verdoppeln
er4ikt Wert fuer die Initialisierung von TimerR
> Timina initialisieren
Flas4 fuer "Bute empfangen” setzen
Timer freisgegeken”
Tas weiter bei 84453
269
CC Br
S+ PRASIc "ZZ - - - - - -
Interrupt-Rautine zum Lesen van Band “Fortsetzung?
gast
54052
64055
64057
64059
64a6l
54963
6465
64068
64970
64872
64974
6476
640783
64984
64983
64085
64987
6499
64931
64993
840965
84499
54101
84103
54106
64103
54110
84112
84114
54116
84118
84120
S4122
4124
84125
54127
64123
584132
64134
64136
64138
s4idl
54143
84145
84147
584149
84151
64153
54155
841565
54158
84164
84162
54163
84165
84167
LDA
BEQ
STR
LDRA
sSTA
LDR
sTtA
STR
LDA
sSTA
BE®
LDA
sSTA
LDA
STA
LOA
STR
LDA
ORA
STR
I’MP
JSR
STA
LDX
JSR
LDR
BEQ
STA
LDR
BIT
BPL
LDA
BNE
LD*
DEX
BENE
LOAR
ISR
BNE
LOA
STR
JMP
BVS
BNE
LOR
BNE
LODR
BNE
LOA
LSR
LDOR
BMI
BCC
CLC
BCS
RAND
sta
158
64033
168
#0
150
#123
56333
138
ssase
854138
#0
170
ss2lez
54192
64169
181
64138
182
54138
167
187
84163
S413E
S4155
#15
iva
Murde EOB empfangen”
Nein: Interrupt akschliessenr
Fla4 fuer Lesefehler setzen
Flag fuer EOR ruecksetzen
TimerA-Interrupt freigeben
Fla4 fuer "Timer enakled” setzen
Flz4 fuer ’EOB empfangen”
in Flas fuer "qweltiges EOB empfangen” uekertragen
kein EOB? Jar weiter kei 84083
Flasu fuer "TimerR dissakled setzen”
TimerA-Interrurt sperren
Inhalt des seriellen Shift-Reaisters fuer Read
in Register fuer gelesenes Brte bringen
Flags fuer Lesefehler «“Parity etc.?>
mit Fi29 fuer Impulslaengenwechsel verknuerfen
ergibt Fla9 fuer Lesefehler des gesamten Bytes
> Interrupt abschliessen
> Flaa= ruecksetzen,. Zaehler initialisieren
Flsas94 fuer "Bute empfangen” ruecksetzen
Wert fuer Initialisierung von TimerA
> Timing initialisieren
Anzahl noch zu verarkeitende Blacks
= @? Ia: weiter kei od4dili2
Anzehl noch zu lesende Blocks nach (167
Maskerwert fuer Zaehlung vor Lesen
Flag fuer Lesen van Cassette = Ende”
O4
’ vebkertragen
alle erwarteten Zeichen empfangen? Ta: weiter hei 84141
queltises EOB empfangen?
Ja: weiter kei 684134
Anzahl nach zu lesende Bluachs
= 1?
Nein: Interrupt =kschliessen
Bit 3, "Long Block”
> Status setzen
Unbedingster Serung zum Interruptabschluss
Flza4 fuer Lesen won Cassette auf Abtastung setzer
se
> Interrupt akschliessen
Flaa fuer Lesen van Tzpe = Lesen” Iar weiter bei 64192
= Zaehlunga? Ja: weiter kei 641592
EOR empfangen?
Ja: Interrupt abschliessen
Brte-Lesefehler”?
Ja: Interrupt abschliessen
Anzahl noch zu lesende RBlacks
Bit @ in Carry schieken
gelesenes Bute
Bit 7” gesetzt “Zasehlurmaskute)? Jar weiter kei 584163
noch zu lesende Blocks = 17 Nein: weiter kei 54136
nach zu lesernde Elnockzs = 17 ITar weiter bei &412E
Bits & kis 3 isolieren
und fuer Zaehlung akspeichern
270
=S4051
cC- Br
Interrupt-Rautire zum Lesern „van Band
641659
84171
64173
64175
64177
5413
64132
684134
64136
84133
54170
654192
54194
54196
84221
64223
642253
4227
54223
54231
433
a42235
842.37
54239
54241
4243
54245
4er
54243
54232
54254
= Peter
54253
Ah nd hc cn
EL LLLLLLLLL
MDMURID ASPIRE DJ Pu By
DB u BL 5 ec S BT aaO En Be a Dr cr 5)
n& Prien
+ PFHS>SICc
DEC
BNE
LDA
STA
JSR
LOA
STR
BEQ
LDR
STA
BNE
LDA
BEO
LOR
ISR
LOA
JMP
JSR
93 BECC
IMP
LD%
DEX
BEQ
LOA
BER
LDY
LOA
CMP
BER
LOA
STA
LDA
BEO
LOS
CPx
BCC
LD%
LDA
STA
LOA
STA
IN%
IN“
ST%
IMPF
LO;
[F#
EEÜ
LOA
I 01 ==
RHE
DA
LP
BHE
IHE
IHC
ira
54133
#64
ı1va
64338
#0
171
54133
ıIı
EN
IF ııı
4 »
ee) Pe DI ee m
NE NEN ENT,
Dal Wh DW ND
Fr
„.
r er
% .
r 27
„a
Le = = = = = =
Fartsetzung)d
Zaehler „erminderrn :
Nein: Interrupt abschliessen
sef1l23 Lesern
Prcoar ammstartadresse in Lsdezeiger uvuebertraser
Le
>
Pruefsummenwart lceschen
Abschluss IRQ
Lesef124 Ende
Abschluss IRND
End OF Block “EOR) emrfangen”
Nein: weiter hei 642065
Bit Z “Shart Block)
> Status setzen
Lesetla4 Aktastung
> weitermachen ...
> Ende erreicht”?
Nein: weitermachen ...
> Erde Read Block)
noch lesende Blocks
= 17
zu
Ja: Fass}. Korrekturpsss
Fl=a4 fuer "YERIFY” gesetzt?
Nein: weiter hei 54235
Index :ı= a
gelesenes Bute
mit dem im Speicher stehenden vergleichen
Gleich: weiter kei 64233
Fla49 fuer Zeichen-Lesefehler setzen
Fehler zufswetreten”
Hein: weiter hei 64314
bereits 31 Fehler
aufsetreten”
Ja: Bit 4 nicht korrigaierbarer Fehler) im Status setzen
Index fuer Lesefehler
laufendes Adresskuote hiah
im Stack speichern
laufendes Adressbute lau
ekensa
Index um zwei erhceher
und akspeicherr
> weiter hei 84314
bereits alle Lesefehler
korrisiert?
Ja: weiter bei 654335
laufendes Adresskvte cam
mit fehlerhaftem Adresskrte low verqyleichen
Imsleich: weiter hei 64323
laufendes Rdressbote Hhiah
mit fehlerhaftem Adresskbvte high veraleichen
Ingleich: weiter kei 64323
Fa==s2
Horrekturzasehler um zwei erhoehen
271
=>+1572
alle Synchronisationsbkvtes empfangen?”
CB 84 BRASIC
Interrupt-Routine zum Lesen von Band “Fortsetzung?
642838
542909
654292
64294
64296
64298
54300
64301
64393
64305
64307
54389
64312
54314
64316
64318
84319
64321
64323
64326
64323
64338
64332
64333
64335
64338
64341
64343
684344
64346
54348
64359
64352
64354
64356
64358
643608
64363
64366
64368
64378
64372
64374
64376
64379
64382
84334
64336
643938
64390
64392
64395
LDA
BEQ.
LDR
LDY
CMP
BEQ
INY
sSTY
LDA
BEQ
LDRA
JSR
BNE
LDA
BNE
TAY
LDA
STR
JSR
BNE
147
64393
1893
#0
c172),Y
84323
132
182
84314
#16
650952
654323
147
684323
139
172,7
54731
654395
#128
170
#1
56333
56333
190
54348
190
167
64368
158
64395
171
172>,Y
171
171
54731
84721
584370
171
189
64395
#32
65052
65212
Yerifv-Fla9 gesetzt?
Nein:
weiter kei 64303
gelesenes Bvrte
Index
mit dem im Speicher stehenden Eyrte vergleichen
ı=> 9
Gleichs weiter kei &43273
Fehlerflas4 setzen
Fehler aufgetreten?
Nein: weiter kei &4314
Eit 4
(Lesefehler, YERIF'Y-ERROR)?
> Status setzen
Inbkedingter Sprung
Verifv-Flag gesetzt?
Ja: weiter kei 64323
Index
ı= a
gelesenes Byte
abspeichern
> Pointer erhoehen
Abschluss IRQ
Leseflas :=
Ende
TimerR-Interrupt verhindern
Interrupt-Flaas ruecksetzen
Anzahl noch zu verarkeitende Blacks
= 8?
Ja: weiter kei 64348
neuen Wert speichern
Blockzaehler „vermindern
= 8? Ja: weiter kei &Ed3sda
Fehler in Passl aufgetreten”
Ja:
weiter kei 8654395
Anzahl noch
zu verarkeitende Blocks
Abschluss IFR®O
> Ende Tspe 1.0
> Prcarammstartacresse in Ladezeiger uebertrager
Pruefsumme loaescher
Pruefsumme bilden
> Transportzeiser erhsehen
> Ende erreicht?
Nein: weitermachen ...
Pruefsumme mit
selesener Pruefsumme »ersleichen
Gleich:
Bit 5
weiter kei 64395
(Pruefsummenfehler)
> Status setzen
> Abschluss IR®
272
8
Ss. = 33
C-EBnr
+ PeHz>Ic
Proyrammstartadresse in Transportzeiger uehkertragen
654338
544089
84402
54404
84406
LOR
STR
LODA
sSTA
RTS
174
173
193
172
Prcoagrammstartadresse high
in Transpaortzeiger kringen
Prosrammstartadresse low
in Transportzeiger kringen
Vorbereitung fuer Byrte-Read’blrite
54407
684409
84411
84413
64415
84417
84419
84421
LDA
STR
LDA
STR
STR
sTA
STA
RTS
#8
153
#0
184
158
155
159
8-Bit-Zaehlunga vorbereiten
Bit-Impuls-Flag9
Lesefehler
Paritv-Bit
Flag fuer Impulslaengerwechsel
Impuls auf Band schreiben
684422
84424
654425
54427
54429
54431
54433
64436
64439
64442
64444
64447
64449
64451
64453
64455
Flag fuer
54456
84457
54459
SEC
ROR
BMI
"Block yeschrieken”
182
64521
serielles Bit-Shift Register
Bit a in die Carrv-Flag schiekenr
Wert fuer "short" “kurzer Impuls)
Carry = 0? Ja: weiter kei 5443]
Wert fuer "lang" Ülanser Impuls)
Timer-hert hiah
Recu in TimerB lau Latch
“R in TimerB hish Latch
Interruptflagsr ruecksetzen
TimerB starten
Tape-Write Bit
imvertieren.
da Impuls =al= Yoallwelle “sespeichert wird
momentanen bert in Zera-Flagy
setzer
Fla93 fuer "Block geschrieben” nesatiıv, machen
Akschluss IRO
Interrupt-Rautine fuer Schreiben zuf Band (Puffer?
4461
54463
84465
84467
64469
84472
84474
g447E
84475
64430
84433
84485
54487
54490
54492
64494
LDA
BNE
LDA
LOS
JSR
BNE
INC
LDA
BPL
JMP
LDA
BNE
ISR
BNE
INC
BNE
163
54433
#16
#1
54433
84521
183
182
4521
54599
159
54496
854429
84521
153
84521
"kyte"-Imeulzs geschrieben?
Jas weiter kei 54433
Wert low,
Mert high fuer "kute”-Freauenz
> "kute"—- Impuls zuf Barıd
falls noch erste Hzlkwelle, Akschluss
Flag fuer ""kute"-Impulz geschrieben”
Flag fuer "Eloack seschrieken” pasiti'r?
Ja: Akschluss IFO
> Fortsetzung Write.
IFEQ
setzen
nal.
warm Bloch geschrieken
"long"- Impuls seschr ieken”
Jas weiter hei 684498
> "lana"-Impuls zuf Band
falls noch erste Halkwelle,
Fl34 fuer ""laona"—- Impuls gVeschrieken”
Akschluss IRQ
Abschluss IRQ
setzen
273
BHTEe FR)
ce &+ BHSIC WwZ - - - = - - >49
Interrupt-Rautine fuer Schreiben auf Band (Fortsetzung?
54496 JSR 684422 > Bit zuf Band
54493 BNE 84521 falls noch erste Halkwelle, Abschluss IRQ
54501 LDA 184 Bit Imeuls Flas
54503 EOR #1 imwertieren
54505 STA 164 und speichern
84507 BED 34524 wenn. a, ‚dann keide Bit-Impulise geschrieken
54549 LDA 1393 Bit @ im Bit-Shift-Resister invertieren
545211 EOR #1 logisch 8 wird als "shartlong",
54513 STA 1893 losisch 1 a1l= "longrshort" Yespeichert
84515 AND #1 Iifd. Bit herausfiltern
84517 EOR 155 mit "Paritv-RBit fuer Byte’ verknuepfen
8645173 =TA 155 und dort wieder abspeichern
e4azi IMP 65212 = Rkschluss IRQ
84324 L5SR 1393 Bit herausshiften
S4sze DEC 163 8-Bit Zaehler vermindern
84523 LDA 163 Ende erreicht?
845320 BEQ 54398 Ja: Pruefsumme kilden
84532 BPL 84521 Nein: weitermachen, Abschluss IRO
545234 ISR 9 Sd4dır? > 8S-Bit Zaehler setzen, Flzaas etc. loeschen
545337 CLI
54538 LDA 165 Synchronisationsbutes geschrieben?
5.4540 BED 5456509 Ja: weiter hei 64560
84542 LOS 40
84544 STH 213 Puffer -Pruefsumme loeschen B
54545 DEC 153 Syrnchronrisationszaehler vermindern
54548 LOS 1304 Anzahl nach zu schreibende Blocks
s4a2a CPH #2 = 2 ferster Block geschrieben?”
Ss45sz BNE 64556 Nein: weiter kei 64558
5.4524 ORA #128 Bit 7” im Synchronisationsbyte setzen
8435968 STA 139 in Bit-Shift-Register bringen
5453593 BNE 64521 Abschluss IFRND
54568 ISR 0 Bdrzl >= Ifd. Adresse mit Endwert vergleichen
E55 BIC 64575 Kleiner: weiterschreiker
&435.5 BNE 84456 Imngleichs: Flas fuer "Black seschrieken” setzen
S45857 INC 173 zsanst Ifd. Adresse Chiah> ungleich machen
84283 LOA 212 Fuffer-Pruefszumme
84571 STA 1393 in Bit-Shift-Resister kringen
245723 BCS 64521 ARhschluss IR®O
54570 LD'Yr #4 Index :ı= 0
&47"7 LOA lv .T laufendes Zeichen im Speicher
5453793 STA 133 in Bit-Shift-Resister kringen.
E47221 EOR 212 Pruefsumme
54533 STA 219 kilden
54535 ISR 84731 > Pointer erhoehen
E45335 EBENE 84521 Akzschluss IRO
54530 I.DA 135 Fzaritv-Bit fuer Bvte
54592 EOF #1 im,ertieren
545934 STA 1393 und inz Bit-Shift-Reuister bringen
545965 IM oO 85212 > Akschluss IRU
274
CO Br1
Fortsetzung der Write-Rautine,
64599
846501
64603
64606
6465083
64610
84612
64613
64616
IRQ #1,
64618
64620
64623
64625
64627
64629
64632
64634
64636
64638
64641
64642
64644
64646
64648
64651
64653
64655
64657
Ende-Recorder-I’0O
64559
64669
64661
64664
54666
64669
64672
84674
64677
64688
64683
64685
64638
64691
64694
64695
64696
64699
IRQ-Vektor
64701
64794
64707
64718
64713
er RBSHRSIC
DEC
BNE
JSR
LDA
STA
LDX
SEI
JSR
BNE
LODA
JISR
BNE
DEC
BNE
JSR
DEC
BPL
LD*S
JSR
CLI
INC
LDRA
BEOQ
ISR
LDS
SsT-
ST*
BNE
PHP
SEI
LDR
ORR
STR
JSR
LDA
sta
JSR
LDR
BEQ
STR
LDA
sTA
PLP
RTS
ISR
BEQ
LDA
STA
LDR
sta
RTS
199
64605
54714
439
167
#8
ea4r’ol
84396
Schreiben des
#128
64431
64596
167
54596
84407
171
84396
410
84701
171
1928
64696
64393
#9
165
182
54334
232685
#16
33265
684714
4127
56333
549839
672
64694
89
671
788
54659
84596
setzen
54915,%
798
84916,%
89
falls Black seschriekhen
noch zu schreikende Blocks
= 98? Nein: weiter kei 846065
> Reccordermator ausschalten
Zaehler fuer Laenge der Shorts
Offset fuer IRD #1 fuer brite (64613)
> IRQ-Veltor setzen
Aeschluss IR®O
Headers
"header"- Impuls
> schreiken
falls noch erste Halkwelle,. Akschluss IRO
Zaehler fuer Header vermindern
Ende. erreicht”? Nein: Akschluss IR®O
> 8-Bit-Zaehler setzen, Flaas etc.
Dauer der Shorts var und nach Daten
Ende erreicht? Nein: Akschluss IR
IRQ #2 fuer Write (öd4d4El)
> IRQO-Veltor setzen
lceschen
Dauer der Sharts
alle Blocks geschrieken”
Ja: weiter kei 646965
> Zeiger zuf letztes Zeichen setzen
Syvnchranisastionszaehler setzer
Flag fuer "Block geschrieben”
Inkbedinater Sprung
ruecksetzer
Status retten
IRQ verhindern
Bildschirminh=alt wieder sichtbar machen
> Recardermotor ausschalten
alle CIR 8525-IRQs sperren
> Timer Interrupt fuer Tastzturskfrage setzen
Ist Hiahkvte des weretteten IFQs
= 8? Ja: fertig
geretteten IRQ-Vektar im IRQ-Vektaor uebertrauer
Status wiederherstellen
> Ende Recorder-T.'C
Akschluss IR®
Viert aus Takelle in
IRQ-Vektor bringen
275
CO Er
=I4 FHR>Ic
4,714
Hilfsrautinen zur Bedienung des Recaorders
54714 LOA
4716 ORA
54718 STR
s4r2a0 RTS
4721 SEC
s4r2z2 LOA
64724 SBC
54726 LDA
54728 SBC
54730 RTS
1 INC
3 BHE
> INC
vRTS
n hy
4
4
4
4
I 3)
FG
r
v
r
RESET-Rauti
54733 LO
4748 SEI
4741 Tas
54742 CLD
54743 ISR
84746 BNE
54743 .IMP
„
2
»
Test. ch SH
ne, Rufruf
4255
S4vrea
= Te!
32768)
Lortridse
a
n.
Ja
R
De re -
De ef
initi
Fecardermatcor ausschalten
Transportzeiswer mit Endadresse veraleichen
Transpartzeiwer erhoehen
keim Einschalten
Sstackpcinter initialisieren
> Cartridse eingesetzt?
Nein: normaler RESET
Sprung in SK Cartridge ROM Area
-,
.
eset—-RBit ruecksetzen
I-G-Reset
freien Speicherplatz bestimmen
Yelitaren van 788 kiss 3519 festlegen
Fernzsehmorm“ Taktfrequenz feststellen
Sprung nach 58260, Fortsetzung RESET-Routine
ROM Rrea 732768 bis 44959) beleat
Bereich
non 547234 Kiss
van 327 Y2 Kis
wmaleich”? Tas
83 mit dem
SS neraleichen.
alle Evtes pruetfen
43 "CcBNSa”
alisieren
Accu TR)
54816. Startadresse der Standardvektoren
Fl=4. fuer "Tabelle mach Vektoren” setzen
276
YECTOR: Lesen und Setzen der Serunawwektaoren
54794
64796
654798
84504
84393
54305
849307
645099
84912
64813
64315
64816
64818
64328
84322
649324
64326
64328
64339
84832
64334
654836
64338
64349
84342
54344
64346
sTt®
ST'r
LO
LDA
BCS
LDR
STR
STR
DE'Y
BPL
RTS
195
196
#31
383
54307
«195),Y
ID .Y
7883
843a4
234
254
254
243
242
242
242
243
241
241
246
241
243
254
244
245
r. y
‚Y
39953
65126
85095
52282
52097
81966
82032
52259
61783
518398
83213
681758
82253
85126
62629
852957
Pointer setzen
Zaehler fuer 15 Vektoren setzen
Wert aus Vektortabkelle lesen
Takellenwert in anderen Bereich kopieren? Isa:
Wert in Yektortzbelle uekertraser:
IRQ-YVektar
BRK-YVektor
NMI-Vektor
OPEN
CLOSE
CHKIN
CHKOUT
CLRCHN
CHRIN
CHROUT
STOP
GETIN
LLALL
LORD-Yelkteor
SAYE-YVektor
Pruefung auf freien BASIC-RAM Bereich '
64348
54350
64851
54854
84357
64368
84961
54963
654365
54567
54369
584871
54872
54574
843765
84379
548308
54381
64383
54385
84387
54383
54390
84392
64894
643985
54397
64339
54909
54902
LDA
TAY
STA
sTa
STR
INY
BNE
LDs
LDY
sT«
STYr
TA’r
LDR
sta
INC
LORA
TAs
LDA
STR
CMP
BNE
ROL
sta
CMP
BHNE
TARA
sSTA
INY
BNE
BEQO
64
#0
2
Ssi2
‘683
351
#609
#23
178
173
#3
174
194
T
‚vr
‚r
21337 .Yr
#35
1935.
193) ,YV
&4
sag
Bereich 2. “ao. seäsr > r
PR VR>
in Pointer zuf Cassettenpuffer kringenr
YR
Startadresse high — 1 fuer RAN-Test
Peinter hiah um eins erhcehenr
„orherigen Wert merken
Bitmuster alaıalal
in Speicherstelle schreiben
umd vergleichen. ck akgespeicherter Wert Jarın
Nein: kein RA mehr, weiter kei S490d4
sollte wchl ASL sein, eraikt aber 1a1la1lall
in Speicherstelle schreiker
und »ersleichen,. ch abhwespeicherter Wert derin
Nein: kein RAM mehr, weiter kei S49ad
gemerkten Wert wiederherstellen
Index erhoehen, Pzaaeende erreicht?
Hein: weitermachen
sonst auch Fointer hiah um eins erhoehen
277
-S12,...,.1023) mit @ fuellen
ı= 828, Startadresse des Cassettenpuffers
C Er 84 BRARSIC zZ - - = - - -
Pruefung auf freien BASIC-RAM Bereich (Fortsetzung?
54904
5435
684906
54908
54909
54912
84914
54917
584919
54922
TrA
TAS
LD'Y
CLC
ISR
LDRA
STR
LDA
STA
RTS
Pointer low
ins *R
Pceinter hiah ins "TR
> Painter auf Ende des Arbeitsspeichers setzen
Startadresse high des Speicheranfanss (MEMBOT?
Startadresse high des Bildschirm-RAMs
Takelle der IRQO-YWektcaren fuer Recarder-Bedienung
54923
549253
84927
64923
108
2as
49
44
I’O-RESET
54931
54933
84936
54933
584942
4944
54947
54950
54923
54956
64958
4961
84964
54367
De)
2
oo
Pride
Lernen MD AL cd
I
L
BSG add
LOA
STA
STR
sta
LDA
sta
STR
sta
sta
LD*S
st“
STx
st“
DE“
ST“
LDR
STA
LOR
STA
LOR
STA
LOA
STA
LOA
BEQ
LORA
STA
LOA
JMP
LER
STA
LO
STA
IMPF
252
251
234
249
362333
565931
40
PU u
TNWO N
SETNAM: Festsetz
STA
STH
STY
RTS
54518
54461
39933
523738
ma der Daten
Hrite #1 auf Cassette (Header)?
Hrite #2 auf Cassette (Puffer?
Harmalwert (Tastaturakfrage etc.?>
Read von Cassette
slle IRß=s
und alle NMIs sperren
A der IRQ-CIRA
NMI-CIRA
IRQ-CIR
NMI-CIA
Control Resister
Control Register A der
Control Register R der
Contrcol Resister k der
gesamten Port B der IRQ-CIR auf Eingang setzen CKeykasrd)
ekensa Port B der NMI-CIR (User-Port>
Lautstserke des Synthesizer-Chips auf null setzen
gesamten Port A der IRR-CIR auf Ausgang setzen (Kevkoard?
Port AR CHMI-CIA>
Bit @ kis Bit 5 won Part A CNMI-CIA>
Eit & und Bit 7” auf Eingang
Bitmuster 111a4111
in 86S10-Daterpaort schreiken
Bitmuster aa1laıılll
in SI1A-Datenrichtungsresister schreiben
Fla4 fuer Taktfresauerz (Fernsehnormakhaengaig?
Fernsehnorm = PAL? Hein: weiter kei $7Ada4
Wert 16421 fuer Interrurt nach Timer RA
auf Rusgyanıaı setzen,
Wert 1745 fuer Interruert nach Timer A
539
5
> weiter bei
fuer den Filenamen
Laerse des Filenamens
Startscdresse des Filenzmens low.
High
278
SETLFS: Festsetzung der OPEN-Parameter
es5a24 STA 184 Filenummer
55025 STX 135 Ger aetenummer
85028 STY 195 Sek:undseradresse
85933 RTS
RERODST: 1.C-Status in’ Accu bringen:
85831 LOA 136 Ger aetenummer
s5a33 CMP #2 =2 “<RS-232 Kanal)?
85435 BNE 859509 Nein: Bus’Tape-Status, weiter kei 685050
854037 LDA 563 RS-232 Statuskvte
85044 PHRA merken,
65441 LDA 40
s5A43 STA 563 lceschen.
85045 FLA alten Status in Accu
85047 RTS
SETMSG: RAussskemoadus fuer Betr iehscevstemmeldungen setzen
65943 5TA 157 Ausasbeflag, Flas #uer Direktmodus
55058 LOA 144 Statuskyvte lesen
Einsprung fuer ’"Status setzen”
865052 ORA 144 im Accu wesetzte Bits im
8650954 STA 144 Statusresister setzen
s5aS6 RTS
SETTMO, timeout-Jdisskle lceschen “Accu=0),. setzen ".Accu=128)
65957 STA 545 timeaut-disakle z
s5a68 RTS
MEMTOP. Lesen “Carrv=1) und Setzen Carrv=i) des Speicherendes
85061 BCC 6509589 Carry gesetzt? Nein: weiter kei 624653
e5as3 LDX 5423 Speicherende lcu ins "FR,
85956 LDY 544 higah ins "TR
85A59 STA 843 “Rt nach Speicherende 11cm.
85072 STYr a4 YR nach hiah speichern
85975 RTS
MEMBOT, Lesen “Carrv=1> und Setzen (Carrv=i) des Speicherkesinn®
85976 BCC Bad Larry gesetzt? Nein: weiter bei S7034
5575 LDS ag Speicherbesirn lcom ins XP.
s59481 LDY E42 KHiah ins TR
s5a84 ST 841 sR nach Speicherende Ic.
sIag7 STY 842 Ye nach hiah zspeicherHn
ssaga RTS
279
CE = + EHZIc zZ - - - - - - 509521
NMI-Rautime. Rufruf durch RESTORE-Taste
55491 SEI
s2a32 IMP .v92)> Noermalwert des Yektors (792.793): 659095
85035 PHRA Resister retten
BIA9E TARA
85497 PHR
ssass TTA
s51ma LDA #127
851 STA 5365589 alle NMIs verhindern (Interrurt Control Resister)>
55143 LOYV 565933 Rufruf durch RESTORE-Ta=ste?
55108 BMI 855138 Nein: weiter kei 655138
85110 ISR 84770 > Cartridge eingesetzt?
55113 BNE 85118 Nein: normale NMI-Rautine
585115 IMP 32770) > Sprung in SK.Cartridse ROM Area, Warmstart-Vektor
HMI-PRoautine,. Rufruf durch RESTORE-Taste Fortsetzung?
EI118 ISR 863164 > Flau fuer diverse Tasten “RUNSTOP> aktualisieren
5121 TSR 65305 > STOP-Taste wedrueclkt?
85124 BNE 55138 Nein: weiter kei 851233
salzes ITSR 2654799 > RESTOR: Yektartzkelle (TE8,...,8195 initialisieren
85129 TSR 854931 > 1IvO-Reset
s5132 ISR 5565483 > Screen Editor Reset
55135 IMP 240982) > 593235: BASIC-WHaermstert
NMI-Handlina fuer RS-232
5512328 TTrA ert zau= dem ICR
552137 AND 52 mit dem RS-232 Reswister fuer aktive NMIs verknueptfen
85142 TR und inz XR retten
52143 AND #1 Merden Daten ueker den RS-232 Kanal gesendet”
5145 BED 835187 Nein: weiter bei &5197
85147 LOAR 2 585976 Fort A der NMI-CIA
551520 AND #251 Bit Z fuer RS-Z232-QUT (fuer ORAR> auf null setzen
Aainez ORA 181 zu sendendes Bit in den Wert fuer Part R hineinkringer
55124 STAA 2 565976 and wieder in Fort A akzspeichern
83157 LOA A723 Hert zus RS-232 Fesister fuer aktive HMIs
sSleli STA 56599 in Interrupt Control Resister {NMI-CIR> uebertragen
52163 TasA aktive NMI= fuer RS-232 Datentransfer
s5184 AND #12 Bits 1 und 4 iscalieren {HMIs fuer Datenrempfana?>
EA21558 BED 55191 Beide Bitz welcescht? Ia: weiter bei 85181
BSa18E AND #2 Aufruf der NMI-Routirne durch Timecaut von TimerB’”
Ealrl BEO 85178 Hein: Stzartkit, weiter kei 55178
ES5172 ISR 85238 > empfangenes Bit verarbeiten
Balz ITMF 0655181 > weiter kei 585191
Sally TSE oO 69287 > Daterempfana fuer Byte neu vorkereiten
55171 I5SR 6861115 > Wekertraaung des naechsten Eitz vorbereiten
585134 TMP 65208 > Akschlu=s= RS-222 NMI-Handl ins
Balls TARA
BOISE AHEO #2 werden Daten empfangen?”
521930 BED 65198 Hein: weiter kei 65198
219, TSR 69239 = emp fangernes Bit versrheiten
137 TIME oO 52a > Abschluss FRS-222 NMI-Handling
mon TER
rn'23 AHD #1 wird auf Startkbit wVeusartet”
Eac) BEI ESIE0OE Hein: Abschluss FRS-2232-HMI
af TS oO SIERT > Datenempfzna fuer Bete neu S„orkereiter
280
Cr &+ BrRrSIlcl "zZ u ö e m er = ee pe 8 1
RS-232-NMI-Handlina zkbschliessen
55286 LDA E73 Wert zus RS-23Z2 Resister fuer aktive MAIS
“5209 STAA 565539 in Interrupt Control Besıcter <NMI-CIR> vebkertragen
85212 PLA Reaister wiederherstellen
85213 TAY
865214 PLA
85215 TA%s
65216 PLA
85217 RTI
Timerkanstantentzkelle fuer NTSC
59218
65220
85222
85224
835226
63228
55230
535232
65234
85236
53238
85241
55243
65245
839248
83250
835253
83235
65259
635262
65265
63267
85270
63273
[bey
65273
85281
85254
832987
55298
65293
65296
65239
55301
55304
53306
65309 :
55312
85314
65317
53320
655323
65325
563833
#17
36391
573
363589
42532
Sesg2
Kal,
Baucd
Baucd
Baucd
Baucd
Baud
Baud
Baucd
Baud
Bauıc
Bzaud
Part B “NMI-CIR> akfrauen
Bit a ıRS-232 IND isolieren
und in Resister fuer empfangenes Bit krinsen
TimerE fuer DTstenempfang neu anpassen
Arkeitsmadus fuer TimerE festsetzen und Timer starten
Wert aus RS3-232 Reqister fuer aktive HMI=s
im Interrupt Cantrcal Reswister (HMI-CIR> uvekertr=uer
Latch
„an TimerB mit Maxzimalwert vorkelemer
> weiter hei
TimerE fuer Bzud Rate setzen
Arkeitszmachis Fuer festsetz =tarten
Bits 1 und 4
mit RS-Z32 Feusister
und wieder
TimerE ern amd Timer
fuer altive HMI=
ahspeicherH
nerlimnuentfer
Latch „son TimerB mit Naximalwert vocorbe
leyen
Reswister Martlizerge
in Zaehler fuer Martliserge uekertrager
281
CE 5:4 EPErRSIc zZ - - - - - -
Routine fuer RS-232 Handling
53332
53333
53335
53338
[LINE IN En ın
nn ini
A A a ra Bl Eu
TAs
LOR
ROL
TA'Tr
TARA
ROC
STA
TrRA
ADC
sta
RTS
NOP
NOP
PHP
PLA
ARHD
FHR
PHR
TAR
PHRA
TYrA
PHR
TS%
LODR
AND
BEO
IMP
JMP
552
280.8
#16
583368
vag)
7385
llerte aus Tabelle fuer Baud Rate
in Werte fuer. die Baud Rste zum Senden umwandeln
£Rufruf von 625398)
Rufruf won 63733
Ststusresister auf Stack legen,
in Accu bringen
Bit 4 (“Break Flag? lceschen
und als Statusresisterinhalt auf Stack legen
Resister retten
Processar-Status-Reaister in Rccu bringen
BRE-Fla3 isolieren
gesetzt”? Nein: IRQ. weiter hei 65368583
=63126: Sprung ueker BRK-Vel:tcar
=39953: Sprung ueker IRQ-Vektor
Feststellung der TY/-HNHarm und der dau,an =akhaenaigen Taktfreauenz
ISR
LOA
EHE
LO
AND
STR
IMP
LOA
STA
LDA
AHL!
IRA
STA
IMP
u
> Screen Editor Reset
Raster Register des Yideco-Chirps
warten, biz Inhalt des Raster Resisterse = @
Raster Count = Latched Fzster Caunt (Raster Compare
Bit a als Fla93 speichern
>» Werte fuer Interrupt-Timer festsetzen
TimerA-IFQ (fuer Tasstzturskbfrzge) freigekhen
Timer laden und starten (dauernd?
>= Dlack Qut := hiah
.
282
5532
IRO>?
COEBr1
+ PFHSIc
ut
[nd
Sprunatsbelle fuer KERNAL-Rautinen
kei
554099
559412
85415
52418
at 9er
55424
53427
s243g
53433
839436
55433
82442
et tn I ter
85448
85451
ten Zurln
52427
te Tat
85463
sT4ss
63452
Bad’
85475
a4
559431
IMP
IMP
IMP
IMP
IMP
IMP
IMP
’MP
IMP
JMP
JMP
IMP
IMP
IMP
IMP
IMP
IMP
IMF
IMP
IMP
’MP
IMP
J’MP
’IMP
JMP
IMP
Y JMP
JMP
IMP
IMP
JMP
JMP
IMP
IMP
JMP
IMP
JMP
’MP
IMP
SE
65371
54931
in ini Ay dh ın
LED N DON Br N
50)
3)
R..
.
at
ww
ıJı
bu
3
Harduare- Interrupt-Veltoren
zug
eIz
aan
Yektoren Angabe des NHormalwertz keim Einschalten
chne Erweiterunger)
Feststellung der TY-Norm (PRL,. NTSC) und Taktfrequenz
I’O-Reset
Pruefung auf freien BASIC-RANM-Bereich
RESTOR: Yektoren initialisieren
VECTOR: Lesen und Setzen der Vektcrern
SETMSG: Ausgakemadus setzen
SECOND: Ausgabe Sekundzeradresse nach LISTEN
TESRA: ARusaabe Sekundaeradresse nach TALK
MEMTOP: Lesen und Setzen des Speicherendes
MEMROT: Lesen und Setzen des Spreicheranfangs
SCNHEEY: Tastatur akfr age
SETTMG: Time-Qut-Flaga setzen
RCPTR: Zeichen vam TEEE-Bus in Accu
CIOAlT: Aussake Accu zuf IEEE-Bus
UNTLE: Untzalk auf IEEE-Bus
UINLSNs: Unlisten auf IEEE-Bus
LISTEN: zn IEEE-Geraet (Nummer im Accu)
TALK: an IEEE-Geraet (Nummer im Rccu)
REROST: 1I0-Status in Accu
SETLFS: Festsetzung Farameter fuer OPEN
SETHRAM: Festsetzung Filenzme
=82232: OPEN: spezifiziertes File ceffner
=52A97: CLOSE: File Nummer im Accu> schliessen
=619656: CHEKIN: Fileeirgakevorkerei tung
=52032: CHEKQOUT: Filesusaakbevorkereitung
=52259: CLRCHN: aktive Ir’üO-Kanzele schliessen
=61793: CHRIN: Zeichen vom aktiven I-Kanal in Accu
=518395: CHROUT: Ausgake Accu auf aktiven QO-kKanal
LOAD: Load und Verifv van Proarammen
SRAWYE : Speichern van Programmen
SETTIM: Uhrzeit setzen (Accu, #R, YR)
ROTIM: Lhrzeit in Sästel Sekunden in Accu, KR. TR
=53213: STOP: Akfrase STOP-Taste
=51”"N3: GETIN: Zeichen von aktivem Einyakekanal halern
=62225: CLALL: alle Files schliessen
UDTIM: Uhr um eine Sistel Sekunde weitersetzer
SCREEN: Lesen des Bildschirmformats (KT)
PIOT: Lesen und Setzen der Cursöorpasitian (Kr)
IOBASE: Startadresse der IRQO-CIR nach SKReYR)>
283
Adressumrechnung (Betriebssystemlisting) fuer den VIC-20
der Struktur
liegt in zwei
Adressbereich
Das Betriebssystem des Commodore 64, das
her mit dem des VIC-20 ziemlich identisch
getrennten Bloecken zu je acht Kilobytes im
des Computers. Dies sind die Bereiche von 40960 bis 49151
sowie 57344 bis 65535. Beim VIC-20 belegt es einen durchge-
henden Block von 16 KB im Bereich von 49152 bis 65535. Bei
beiden Geraeten laesst sich das Betriebssystem in zwei Be-
reiche aufteilen: BASIC und KERNAL. BASIC (der erste Bereich
von acht KB) enthaelt den BASIC-Interpreter, wohingegen
KERNAL Routinen zur Abwicklung von 1/0 und anderen hardvare-
spezifischen Dingen enthaelt.
von
ist,
Betriebs-
ist, denn
Aufgrund der aehnlichen Strukturierung der beiden
systeme (womit ein gleichartiger Aufbau gemeint
allein durch die unterschiedliche Lage der beiden Betriebs-
systeme ist ein gleicher Aufbau nicht moeglich) ist es, im
Gegensatz zu Betriebssystemen von anderen Commodore-Compu-
tern (wenn man von den CBM 4001 und CBM 8001-Serien absieht,
da deren Betriebssystem bis auf einen Bereich von 2 Kilo-
bytes absolut identisch ist) moeglich, fuer den groessten
Teil der Routinen des Commodore 64 den entsprechenden Be-
reich des VIC-20 anzugeben.
nun eine Gegenueberstellung der Betriebssystem-
Commodore 64 zu denen des VIC-20. Bei den von
der Struktur her gleichen Teilen wurde der Wert angegeben,
der den Wert des Commodore 64 in den fuer den VIC-20 richti-
gen Wert umwandelt. War die Struktur zu unterschiedlich, so
ist kein entsprechender Wert angegeben. Solche Programmseg-
mente werden jedoch auch nur aeussert selten aufgerufen.
Manche Stellen des einen Betriebssystems existieren im ande-
ren nicht. Auch werden manche Bereiche wohl in kaum einem
Programm aufgerufen, sodass nur ein Teil der Uebersicht
praktisch genutzt werden kann, speziell beim Umschreiben von
Programmen:
Im folgenden
bereiche des
Commodore 64 VIC-20
40960 - 49148 49152 - 57340 +8192
49149 - LIJ15l IJMPP Om un... -- --
57344 - 57732 57341 - 57729 -3
57733 - 57734 BNE 57730 - 57731 BEQ
---- -- -- - - - -- 57732 - 57734 JIMP
57135 - 57783 57735 - 57783 0
57784 - 57789 57784 - 57786
57790 - 58234 57787 - 58231 -3
58235 - 58245 58471 - 58481 +236
58246 - 58250 LDX#, JMP 58482 - 58484 JMP
58251 - 58259 Korrektur ____-------------
58260 - 58271 58232 - 58243 -28
58272 - 58273 BNE 58244 - 58246 JMP
58274 - 58306 58247 - 58279 -27
Umlegung des USR-Vektors von (0,1,2) nach (784,785,786)
58307 - 58309 STA 784 58280 - 58281 STA O
58310 58313 58282 58285 -28
58314 58319 STA 785 58286 58289 STA ]
STY 786 STA 2
58320 58438 58290 58408 -30
58439 58462 58447 58470 +B
58463 58540 RESET-Meldung 58409 58446
58541 58550 Korr. CHKOUT _-------------
5855] 58585 Fuellcodes 58492 58527
284
Commodore 64
58586
58592
58604
58624
5859] Zusatz (Screen)
58603 Test CBM-Key
58623 RS-232 PAL
58650
Startadresse des Bildschirms
59609
Umlegung der Adresse (242) nach (677)
59644
59647
59701
>59704
59756
59759
59768
59771
59795
59798
59819
>9822
59839
59842
"direkt"
59646
59700
59703
59755
59758
59767
59770
>9794
59797
59818
>59821
59838
>9841
>9844
steht fuer
sowie
16 Farbcodes
DEC
INC
STX
LDX
CPX
CPX
LDX
59845 - 59847 JMP
59848 - 60000
Bedienung des
60001
60002
60010
677
677
677
677
677
677
677
"direkte
Prozessorports
LDA
LDA
LDA
STA
PHA
1
l
l
58624 - 58650
in VIC-Chip bringen
58651
58678
58947
58949
58971
58994
59154
60763
59157
59392
59413
59421
59427 .
59681
59689
59765
59783
59785
59839
59841
59893
59895
59904
59906
59930
59932
59953
59955
59972
59974
58677
58946
58948
58970
58993
59153
59156
60776
5939]
59412
59420
59426
59680
>9688
59764
59782
>9784
59838
>9840
>9892
59894
59903
59905
>9929
>993]
59952
>9954
59971
59973
59976
7277
NOPSs
Korr
NOPSs
NOPs
8 Farbcodes
772
DEC
INC
STX
LDX
CPX
CPX
LDX
Ausfuehrung statt
59971 -
ektur
242
242
242
242
242
242
242
+71
+139
+138
+137
+136
+135
+134
+133
+132
Subroutine"
59989 direkt
>59990 - 60142
(PP) durch Zeropage
60143
60146
60154
60157
60165
60168
60170
60175
60178
60145
60153
60156
60164
60167
60169
60174
60177
60208
LDA
LDA
LDA
STA
37151
37148
37148
37148
+142
+143
+144
+145
+151
+157
+142
+152
+151
Commodore 64
60123
PLA
LDA #6
Decode/Pointer
Data fuer VIC
LSBs (Screen)
SEI
SEI
ASL
Start Timer
SEI
Start Timer
BMI, BPL
ASL, BPL
ASL, BMI
BIT, BVC
Zaehlschleife
NMI sperren
NMI-Register
JMP
direkt
JSR
286
60472
60486
60510
60705
60777
NOPs
NOPs
NOPs
22
LSR
LSR
LSR
LSR
LSR,
LSR
BCS,
LSR,
LSR
LSR,
LDA,
Timer
STA,
ILL DEV #
JSR
LSRO
BCC
BCC
BCS
BEQ
RTS
+149
+148
+167
+171
+205
+221
+24]
+270
+267
+266
+265
+266
+267
+268B
+269
+270
+262
+263
+262
+254
+254
+254
+254
+255
+255
+255
+255
+255
-255]1
+232
+221
+215
+216
+219
+217
Commodore 64
61463
61476
61478
61480
61491
61503
61517
61538
61544
61559
61565
61475
61477
61479
61490
61502
61516
61537
61543
61558
61564
61573
LDA 1
Timer
58
Belegung von Bit 3 im RS-232
61574
61577
61585
61590
61596
61601
61622
61627
61576
61584
61589
61595
61600
61621
61626
61886
LDA
AND#, STA
ORA#, STA
LDA#, STA
LSR
BCC
LDA 158
JMP
JSR
SEC
sovie
CLEAR ST
JMP
JISR
sowie
Korrektur
Init RS-232
sovie
sowie
LSR, BCS
LSR, BCS
Update RUNSTOP
CMP#, BEQ
PHA
PLA
direkt
direkt
Korrektur
direkt
direkt
Korrektur
Korrektur
CMP#, BNE
CMP#, BNE
+214
+212
+207
+201
+200
+201
+198
+193
+188
+183
+176
+179
+180
+178
+177
+182
+1B5
+197
+192
+188
+202
+191
+164
+162
+151
+152
+153
+131
Commodore 64
63329
63335
63534
63544
63334
63533
63543
63612
63625
Test CBM-Key
PP
Timer Init
BLANK SCREEN
PP
Zusatz
Zusatz
Zusatz
BMI, JMP
Zusatz
Start Timer
PP
SAVE 332767
UNBLANK SCREEN
PP
RESET VIC-II
Absolute
RAM-Test &c.
sovie
I/O-Reset
PHA
PLA
Test RESTORE
sowie
Zusatz (Tape)
288
STA
Update Time
CLEAR IFR
BPL
Zeropage
CLEAR IFR
+125
+127
+114
+106
+110
+113
+123
+98
+98
+87
+90
+83
+80
+77
+68
+62
+60
+52
+62
+64
+61
+60
+8B6
+80
+79
+102
+105
+108
+42
Commodore 64
65371
65408
65409
65418
65526
65530
65407 PAL/NTSC-Test
Fuellcodes
65417 Vektoren
65525
65529 Fuellcodes
65535
289
SYSTEMROUTINEN
Das Betriebssystem des Commodore 64 enthaelt im Bereich von
65409 bis 65525 eine Sprungtabelle, anhand derer elementare
Routinen fuer eigene Programme angesprochen werden koennen.
Diese Sprungtabelle wird auch vom Betriebssystem selbst ge-.
nutzt, wodurch es einfach wird, neue Funktionen zu implemen-
tieren, da einige JMP's der Tabelle indirekte Spruenge ueber
Vektoren sind.
Diese Sprungtabelle ist, von den ersten drei Eintragungen
abgesehen, auch im VIC-20 implementiert, so dass Routinen-
aufrufe in Maschinenprogrammen, die fuer den VIC-20 ge-
schrieben sind, im Normalfall nicht geaendert werden mues-
sen, falls sie ueber die Sprungtabelle ablaufen.
Auch die anderen Serien von Commodore (PET, CBMs) haben eine
Sprungtabelle am Ende des Betriebssystems, die jedoch nur
zum Teil mit der des Commodore 64 identisch ist, so dass ei-
ne Programmaenderung wohl meist unerlaesslich sein wird.
Handhabung der Systemroutinen:
Die Systemroutinen sind so ausgelegt, dass nach Aufruf der
Routine Fehler abgefangen werden koennen (sofern ueberhaupt
welche auftreten koennen). Es kommt daher nicht zum Abbruch
des Programms durch eine Fehlermeldung, sondern es erfolgt
eine Rueckkehr zur aufrufenden Routine. Das Auftreten eines
Fehlers wird durch eine Rueckkehr mit gesetztem Carry ge-
kennzeichnet. In diesem Fall enthaelt der Accu die Nummer
des Fehlers, der dann durch das Programm behandelt werden
kann.
Einige Routinen benvetigen auch Informationen, die durch an-
dere Routinenaufrufe gegeben worden sein muessen (Vorberei-
tungsroutinen), da sonst die Moeglichkeit besteht, dass die
Routine nicht erwartungsgemaess funktioniert.
Bedeutungen der Fehlernummern:
Fehlernummer bei gesetztem Carry im Accu:
0: BREAK
gedrueckte RUNSTOP-Taste waehrend des Programmablaufs
1: TOO MANY FILES
die maximale Anzahl an offenen Files betraegt zehn
2: FILE OPEN
jeder Fileeintrag muss eine andere Filenummer haben
3: FILE NOT OPEN
jedes File muss vor Zugriff geoeffnet werden
4: FILE NOT FOUND
das gesuchte File ist nicht verfuegbar
5: DEVICE NOT PRESENT
das angesprochene Geraet reagiert nicht auf Adressierung
6: NOT INPUT FILE
aus Schreibfiles kann nicht. gelesen verden
72: NOT OUTPUT FILE
in Lesefiles kann nicht geschrieben verden
8: MISSING FILE NAME
bei LOAD und SAVE (serieller Bus) ist ein Filename noetig
9: ILLEGAL DEVICE NUMBER
versuchtes Kommando ist bei diesem Geraet nicht moeglich
290
Eine Fehlermeldung selbst wird nicht ausgegeben; dies muss,
sofern erwuenscht, vom Hauptprogramm aus durchgefuehrt wver-
den. Es ist jedoch durch den Aufruf der Routine SETMSG (sie-
he Beschreibung) moeglich, die Ausgabe einer Fehlermeldung
zu erreichen, die dann lautet "I/DO.ERROR #?", die jedoch zu
keinem Programmabbruch fuehrt. Die Fehlerausgaberoutine be-
ginnt ab Adresse 63227, hat jedoch mehrere Einsprungstellen.
Routinenbeschreibung:
65409: Feststellung der Fernsehnorm (PAL/NTSC)
Aufgrund der unterschiedlichen Fernsehnormen besitzt
der Commodore 64 je nach Fabrikation einen Quarz ent-
weder fuer PAL oder NTSC. Aus der Frequenz dieses
Quarzes werden dann andere benoetigte Frequenzen ge-
neriert. So auch die normale Taktfrequenz von unge-
faehr einem MHz.
Der Quarz hat folgenden Wert: PAL: 17.734472 MHz
NTSC: 14.31818 MHz
Die Taktfrequenz fuer die CPU und alle anderen davon
abhaengigen Bausteine errechnet sich aus der Quarz-
frequenz durch Division durch 18 (PAL) beziehungsvei-
se 14 (NTSC). Daraus ergibt sich, dass der europae-
ische Commodore 64 etwas langsamer als der amerika-
nische ist. Im normalen BASIC sind diese Unterschiede
unbedeutend, bei Datenuebertragungen der RS-232-
Schnittstelle muessen jedoch diese unterschiedlichen
Taktfrequenzen beachtet werden. Auch die Initialisie-
rung fuer den Interrupt muss diesen Unterschied be-
achten, da die interne Uhr genau alle 60stel Sekunden
veitergestellt werden muss.
Diese Routine setzt in Adresse 678 eine von der Fre-
quenz abhaengige Flag und setzt automatisch auch den
Timer fuer den Interrupt zur Tastaturabfrage neu
fest. Ausserdem wird ein Screen-Editor-Reset ausge-
fuehrt.
Die Adresse 678 hat folgenden Inhalt: PAL: |]
NTSC: 0
65412: 1/O-RESET
Beide CIAs sowie der interne I1/O-Port der 6510 werden
initialisiert. Ausserdem wird der TimerA der IRQ-CIA
mit dem fuer den normalen Tastaturabfrage-Interrupt
notwendigen Wert initialisiert (siehe 65409).
65415: Pruefung auf freien BASIC-RAM-Bereich
Diese Routine prueft, bis zu welcher Adresse fuer
BASIC verwendbares RAM vorhanden ist und setzt die
Pointer fuer MEMBOT und MEMTOP
65418: RESTOR
Ruecksetzung der Sprungvektoren im Bereich von 788
bis 819 auf die Normalwerte.
291
65421:
65424:
65427:
65430:
VECTOR
Parameter: XR, YR, Carry
Bei gesetztem Carry wird der Sprungvektorbereich
(788,...,819) in den Bereich uebertragen, auf den das
‚Registerpaar (XR/YR) zeigt. Dort kann die Sprungta-
belle dann modifiziert werden. Das Rueckschreiben in
den Bereich der Vektortabelle erfolgt mit geloeschtem
Carry und der Startadresse der modifizierten Vektor-
tabelle in (XR/YR).
SETMSG
Parameter: Accu
Die hauptsaechliche Routine besteht im Prinzip fast
nur aus dem Befehl 'STA 157'. Doch sollte normaler-
weise diese Routine aufgerufen werden, da die Adresse
157 in anderen Versionen des Betriebssystems eine an-
dere Aufgabe haben koennte. Die Adresse 157 hat zwei
Bedeutungen, die in den Bits 6 und 7 festgelegt wer-
den. Bit 7 gibt an, ob Meldungen wie "SEARCHING" aus-
gegeben werden sollen. Ist Bit 7 gesetzt (ist im Di-
rektmodus der Fall), so werden die Meldungen ausgege-
Ben, ansonsten unterdrueckt. Ist Bit 6 gesetzt, so
verden auch die I1/0-Errors ausgegeben. Wird eine Rou-
tine angesprungen, bei der Fehlermoeglichkeiten be-
stehen, so wird, falls ein fehler auftritt, die Mel-
dung "1/0 ERROR #?" mit der entsprechenden Nummer
ausgegeben, das Programm jedoch nicht abgebrochen.
Der Accu enthaelt nach Aufruf der Routine den Wert
der Statusvariablen fuer Recorder und seriellen Bus.
SECOND
Parameter: Accu
Vorbereitungsroutinen: LISTEN
moegliche Fehler: siehe READST (65463)
Ausgabe der Sekundaeradresse (im Accu) auf den seri-
ellen Bus nach LISTEN. Fuer die Ausgabe der Sekun-
daeradresse nach TALK kann diese Routine nicht be-
nutzt werden.
TKSA
Parameter: Accu
Vorbereitungsroutinen: TALK
moegliche Fehler: siehe READST (65463)
Ausgabe der Sekundaeradresse (im Accu) auf den seri-
ellen Bus nach TALK. Fuer die Ausgabe der
Sekundaeradresse nach LISTEN kann diese Routine nicht
benutzt werden.
292
65433:
65436:
65439:
65442:
65445:
MEMTOP
Parameter: XR, YR, Carry
Bei gesetztem Carry wird die Adresse der hoechsten
verfuegbaren RAM-Adresse in das Registerpaar (XR/YR)
uebertragen, bei geloeschtem Carry wird (XR/YR) in
den Pointer auf die hoechste RAM-Adresse geschrieben.
MEMBOT
Parameter: XR, YR, Carry
Vebergabe der BASIC-RAM-Startadresse (im Normalfall
2048) in (XR/YR) bei gesetztem Carry und Uebertragung
von (XR/YR) in den Pointer auf den Anfang des BASIC-
RAMs bei geloeschtem Carry.
SCNKEY
Abfrage der Tastatur wie durch das normale Interrupt-
Handling auch. Bei gedrueckter Taste wird der ASCII
der Taste im Tastaturpuffer abgelegt. Der Aufruf die-
ser Routine ist notwendig, falls bei gesperrtem IRQ
trotzdem Tastendruecke erkannt werden sollen.
SETTMO
Parameter: Accu
Diese Routine dient zur Handhabung des Timeouts fuer
den seriellen Bus und setzt eine Flag, die im Falle
eines Timeouts abgefragt wird, so dass die Moeglich-
keit besteht, einen weiteren Versuch zu machen, auf
den seriellen Bus zuzugreifen. Allerdings wird die
Flag im gesamten Betriebssystem nicht genutzt, so
dass diese Routine keinen Sinn hat. Es besteht also
keine Moeglichkeit (ausser, wenn dies durch das eige-
ne Programm realisiert wird), den Computer ein Time-
out uebersehen zu lassen (im Gegensatz zu den CBMs).
ACPTR
Parameter: Accu
Vorbereitungsroutinen: TALK (, TKSA)
moegliche Fehler: siehe READST (65463)
Diese Routine holt ein Byte vom seriellen Bus in den
Accu. Das Geraet muss zuvor mittels TALK (und evtl.
TKSA) angesprochen worden sein.
293
65448:
65451:
65454:
65457:
65460:
65463:
CIOUT
Parameter: Accu
Vorbereitungsroutinen: LISTEN (, SECOND)
moegliche Fehler: siehe READST (65463)
Diese Routine gibt den Inhalt des Accumulators auf
den seriellen Bus aus Wird das Byte nicht empfangen,
so wird ein Timeout gegeben. Ein Byte wird durch die-
se Routine immer in einem Zwischenpuffer (149) gehal-
ten, um im Falle eines UNLSNs dieses Byte zusammen
mit der EOI-Kennzeichnung ausgeben zu koennen.
UNTLK
moegliche Fehler: siehe READST (65463)
Senden eines Untalks ueber den seriellen Bus an den
momentanen Talker.
UNLSN
moegliche Fehler: siehe READST (65463)
Senden eines Unlistens ueber den seriellen Bus an den
momentanen Listener.
LISTEN
Parameter: Accu
moegliche Fehler: siehe READST (65463)
An das Geraet, dessen Geraetenummer sich im Accu be-
findet, wird ein LISTEN ausgegeben. Attention bleibt
nach Rueckkehr aktiv und wird erst nach Ausgabe der
Sekundaeradresse (SECOND) rueckgesetzt.
TALK
Parameter: Accu
moegliche Fehler: siehe READST (65463)
An das Geraet, dessen Geraetenummer sich im Accu be-
findet, wird ein TALK ausgegeben. Attention bleibt
nach Rueckkehr aktiv und wird erst nach Ausgabe der
Sekundaeradresse (TKSA) rueckgesetzt.
READST
Parameter: Accu
Nach Aufruf dieser Routine enthaelt der Accu den mo-
mentanen Wert der Statusvariablen. Ist der Inhalt des
Registers fuer die Geraetenummer (186) gleich zwei,
so wird der RS-232-Status in den Accu uebertragen,
wobei das RS-232-Statusbyte danach durch Belegen mit
dem Wert null geloescht wird. Fuer eine zweite Abfra-
ge desselben Werts kann also nicht diese Routine auf-
gerufen werden. Die Bedeutung des RS-232-Statusworts
ist der Erklaerung des RS-232-Handlings zu entnehmen.
Der Aufruf dieser Routine erfolgt normalerweise nach
Eroeffnung eines neuen Kanals.
294
Die Bedeutungen der Statusbits (Bus und Tape)
I ST I Bit- I Recorder I serieller Bus I
I Bit I Wert I (nur Read) I (Read und Write) I
Io 1l 11 - I Zeitfehler, Wrt I
Iı 71 2 1 - I Zeitfehler, Rd, Wrt I
I 2 1 4 I zu kurzer Block I - I
I 3 1 8 I zu langer Block I - I
I4a 1 16 I Lesefehler I - I
I -5° 1] 32 I Pruefsummenfehler | - I
I6 1 64 I Fileende (EOF) I Vebertragungsende/EOI I
I 7 1 1281 - I Geraet reagiert nicht I
EOF tritt nur im Zusammenhang mit Files auf. Bei VER-
IFY zeigt Bit 4 ausserdem Nichtuebereinstimmungen an.
65466: SETLFS
Parameter: Accu, XR, YR
Festsetzung der Filenummer (Accu), Geraetenummer (XR)
und der Sekundaeradresse (YR). Diese Routine muss vor
Eroeffnung eines files aufgerufen werden. Die Gerae-
tenummern haben folgende Bedeutungen:
Tastatur
Recorder
RS-232-Kanal
Bildschirm
UDO
Geraetenummern ab 4 sprechen den seriellen Bus an.
Dabei ist die Nummer vier meist dem Drucker vorbehal-
ten wohingegen die Nummer acht im Normalfall fuer
Diskettenstationen vorgesehen ist.
65469: SETNAM
Parameter: Accu, XR, YR
Diese Routine legt die Daten fuer den Filenamen eines
Files fest und muss vor Eroeffnung eines files aufge-
rufen werden. Ist die Angabe eines Filenamens nicht
erwuenscht, so muss als Laenge des Filenamens der
Wert null verwendet werden. Die Laenge des Filenamens
wird im Accu festgelegt, die Startadresse wird durch
das Registerpaar (XR/YR) festgelegt (niederwertiges
Byte im XR, hoeherwertiges Byte im YR).
65472: OPEN
Vorbereitungsroutinen: SETLFS, SETNAM
moegliche Fehler: O0 (nur Tape), 1],
(falls File# = 0)
Der Aufruf dieser Routine bewirkt das Eroeffnen eines
logischen Files mit den durch SETLFS und SETNAM gege-
benen Parametern und die Eintragung dieses Files ın
die. Tabelle der Fileparameter.
295:
65475:
65478:
65481:
65484:
CLOSE
Parameter: Accu
moegliche Fehler: O (Tape Write)
Ordnungsgemaesses Schliessen des files mit der im Acr
cu befindlichen Nummer und Loeschen des Eintrags in
der Filetabelle.
CHKIN
Parameter: XR
Vorbereitungsroutinen: OPEN
moegliche Fehler: O0 (Tape Read), 3, 5, 6
Vor Zugriff auf ein durch OPEN eroeffnetes File durch
GETIN oder CHRIN (eine Ausnahme bildet die Tastatur,
die nicht durch CHKIN aktiviert werden muss) muss
diese Routine aufgerufen werden. Sie aktiviert das
mit der Filenummer (im XR) verbundene Geraet zum Zu-
griff in dieses File. Ist die Geraetenummer groesser
als 3, so wird ein TALK mit anschliessender Ausgabe
der Sekundaeradresse durchgefuehrt.
CHKOUT
Parameter: XR
Vorbereitungsroutinen: OPEN
moegliche Fehler: O (Tape Write), 3, 5, 7
Sollen Daten auf ein zuvor durch OPEN eroeffnetes
File durch CHROUT ausgegeben werden (Ausgaben auf den
Bildschirm koennen direkt erfolgen), so ist der Auf-
ruf dieser Routine notwendig. Sie bereitet das Ge-
raet, dessen fFilenummer im XR angegeben wird, auf
Ausgaben in dieses file.vor. Ist . die Geraetenummer
groesser als 3, so wird ein LISTEN mit anschliessen-
der Ausgabe der Sekundaeradresse durchgefuehrt.
CLRCHN
Nach Ausgabe oder Empfang von Daten auf oder von
Files wird diese Routine benutzt, um alle offenen Ka-
naele zu schliessen (UNTLK und UNLSN) und die Stan-
dardwerte zu setzen (Eingabe von Tastatur, Ausgabe
auf Bildschirm). Wird diese Routine nach Aktivierung
nicht aufgerufen, so koennen mehrere Geraete aktiv am
I/0O-Bus bleiben und so zum Beispiel die Ausgabe von
Diskettendaten direkt auf Drucker erfolgen.
296
65487:
65490:
65493:
65496:
CHRIN
Parameter: Accu
Der Aufruf dieser Routine bewirkt das Holen eines
Zeichen aus dem durch CHKIN aktivierten File oder,
falls kein CHKIN erfolgt ist, von der Tastatur. Das
geholte Zeichen befindet sich im Accu. Der Kanal zu
diesem File bleibt geoeffnet. Sollen Daten von der
Tastatur geholt werden, so wird der Cursor eiınge-
schaltet und so lange gewartet, bis die RETURN-Taste
gedrueckt wird. Bei jedem Aufruf dieser Routine wird
dann jeweils ein Zeichen geholt. Ist das letzte Zei-
chen gelesen worden, so wird der Code 13 geschickt.
Bei weiteren Aufrufen beginnt der Vorgang von vorne.
CHROUT
Parameter: Accu
Ausgabe eines Zeichens (im Accu) auf den aktiven Aus-
gabekanal. Wird durch CHKOUT kein Ausgabekanal fest-
gelegt, so erfolgt die Ausgabe auf den Bildschirm.
Der Kanal bleibt nach Ausgabe des Zeichens geoeffnet.
LOAD
Daraeter: Accu, XR, YR
Vorbereitungsroutinen: SETLFS, SETNAM
moegliche Fehler: 0, 4, 5, 8 (nur Bus), 9
Der Accu enthaelt die Flag fuer LOAD (0) und VERIFY
(1). (XR/YR) gibt die Startadresse an, ab der das
Programm abgelegt beziehungsveise verglichen werden
soll (nur fuer Sekundaeradresse ungleich null). Wird
als Sekundaeradresse null spezifiziert, so wird das
Programm an die Stelle geladen, ab der es gespei-
chert worden ist. Bei der Rueckkehr enthaelt (XR/YR)
die Endadresse plus eins des geladenen oder vergli-
chenen Programms. Ein Filename muss beim Laden von
Recorder nicht spezifiziert werden.
SAVE
Parameter: Accu, XR, YR
Vorbereitungsroutinen: SETLFS, SETNAM
moegliche Fehler: 0, 5, 8 (nur Bus), 9
Der Accu gibt den Pointer auf die Startadresse des
Programms an. Soll ab Anfang des BASIC-Bereichs ge-
speichert werden, so muss der Accu den Wert 43 ent-
halten, da der Pointer (43/44) auf den Anfang des
BASIC-Programms zeigt. Das Registerpaar (XR/YR) ent-
haelt die Endadresse des zu speichernden Programms.
Die Angabe eines Filenamens ist bei Ausgabe auf Re-
corder nicht notwendig.
297
65499:
65502:
65505:
65508:
65511:
65514:
65517:
SETTIM
Parameter: Accu, XR, YR
Diese Routine setzt die interne Uhr auf den in den
Registern festgesetzten Wert neu fest. Der Wert muss
in 60stel Sekunden angegeben werden, wobei der Accu
das hoechstwertigste und das YR das niedervwertigste
Byte enthaelt.
RDTIM
Parameter: Accu, XR, YR
Das Lesen der internen Uhr erfolgt durch Aufruf die-
ser Routine. Die Register enthalten dann die Uhrzeit
in 60stel Sekunden, wobei der Accu das hoechstvertig-
ste und das YR das niederwertigste Byte enthaelt.
STOP
Parameter: Zeroflag
Ist bei Aufruf dieser Routine die RUNSTOP-Taste ge-
drueckt, so wird die Zeroflag gesetzt. Der Zustand
der uebrigen Flags bleibt unveraendert. Bei gedrueck-
ter RUNSTOP-Taste wird ausserdem ein.CLRCHN 'durchge-
fuehrt.
GETIN
Parameter: Accu
GETIN ist identisch mit CHRIN, mit dem Unterschied,
dass, wird ein Zeichen von der Tastatur gelesen, di-
rekt aus dem Tastaturpuffer gelesen und nicht auf die
Eingabe eines Zeichen gewartet wird. Ist der Tasta-
turpuffer leer, so wird dem Accu der Wert null ueber-
geben. Der Tastaturpuffer wird durch SCNKEY gefuellt,
was normalerweise durch die normale Interruptroutine
geschieht.
CLALL
Diese Routine setzt den Zaehler fuer die Anzahl offe-
ner Files auf null zurueck und fuehrt anschliessend
ein CLRCHN aus. Es erfolgt kein ordnungsgemaesses
Schliessen noch offener Dateien!
UDTIM
Im Normalfall wird diese Routine von der normalen In-
terruptroutine aufgerufen. Sie erhoeht die interne
Uhr um eine 60stel Sekunde. Ausserdem wird das Regi-
ster fuer die RUNSTOP-Abfrage (Flag fuer diverse Tas-
ten) auf den aktuellen Stand gebracht, um die
RUNSTOP-Funktion aufrecht zu erhalten.
SCREEN
Parameter: XR, YR
Nach Aufruf dieser Routine enthaelt das XR die Anzahl
Spalten (40) und das YR die Anzahl Zeilen (25) des
Bildschirms.
298
65520:
65523:
PLOT
Parameter: XR, YR, Carry
Bei gesetztem Carry enthaelt das XR die aktuelle Cur-
sorzeile (0 bis 24) sowie das YR die aktuelle Cursor-
spalte (0 bis 79). Bei geloeschtem Carry werden die
Cursorzeile und -spalte entsprechend den Inhalten von
XR und YR gesetzt. Ausserdem werden die zugehoerigen
Zeilenparameter aktualisiert.
IOBASE
Parameter: XR, YR
Diese Routine uebergibt in (XR/YR) die Startadresse
des I/O-Bereichs, beim Commodore 64 ist dies die
Startadresse der IRQ-CIA. Die Registerfolge und die
Registerbedeutung haengt vom 1/0-Baustein ab und ist
daher beim VIC-20 und C=64 unterschiedlich.
299
STICHWORTVERZEICHNIS
Abkuerzungen der BASIC-Befehle ......... ERSTEN TORTE FTN 9
ABSolutprogramn ss. ar ante ie en 108
BECUMUFALOT. reisen a Brendan ee 222
AUCPTR, Systemroutine ss... nein 84, 293
Adaption von CBM-Programmen ......... ee we 43, 115
Adresse zus eneee FE U TOO EEE 11, 26, 27
Adresszerlegung 4,4204 2u 422 2 ee 32,33
AdTESSFOTMaT: 252220: a I I 7
Adressierungsartten 2:44, Re a u 33, 39
Adressumrechnung fuer den VICE 20 ...2.vsceerereereenee 284 ff
ADSR=-FURKE LION ran aa ann Hin Sad 73, 77
AUD-Wandler zu: an a EEE A ee . 78
RlarmzerE za un NE nn u nee an 94
Amplitude - siehe Huellkurve
"AND"=Verknuepfung u, a een u
Anhaengen von BASIC-Programmen (APPEND) ....ccceererernse 108
AREUS=SINUS sms sea a ae 21-022
ARG, floatingpoint ARGument - siehe Fliesskommaaccus
Arithmetik, binaere - siehe Binaerarithmetik
Ari ehmetik, interne - siehe USR
ALTaY- nee ee Re EEE WE RE DEE EEE 18
ALTAYNEeader sauce en ernannt 18
Assembler/Disassenbler z...42uuu: ws @ 22.200004 EL 34 - 36
ATTACK #354... ir 73, 74
Ausgaberegister - siehe Port
BANDPASS asia een Keane 77
Banking, Kontroölleitüngen ss... 4 0 re ae, 26
Banking, ‚PToOZzessor wu, u. eier 43, 126
Banking, en EUREN UDER EN een AL = Ad: 49
BASIC-ROM su 3 20 au u nano rundet ee ZB
Baudrate (RS- 232). - siehe Uebertragungsrate
BCD-Format, gepacktes .....sseceeeeeneee seen, 13 1945,98
Befehlsliste der BASIC-Befehle ......v.ccroreee LEN. ET;
Befehlsliste der 6502-Befehle ........ceeeeereee.e a DI 38
Betfehlswort. 4.4.0 2.0004 See De a we re Bere . 26
Betriebssystem rs... un Kar ne a ee 7, 26, 43
81.19S5ch1TME8de var reine ER 44 - 46
Bilaschirmspeicher er... 3. aan 4], 42, 46, 50, 54
Bildschirm, Verschieben des - siehe Scrolling
Binseraricthmetik,. usa, isn rerutnıe 10
Binaerarithmetik, vorzeichenlose .......... EEE 10, 11
Binaerarithmetik, vorzeichenbehaftete .......c.sccrererese 13
BIENBeTrexXpoment esse a a are 15
Binsersysten „su. un. Een er sandte 10, 14
BIT wasser ee ir eier 10, 25
BITS,. Setzen Von) sun eu RR TB nt 10, 12
BITSy !Loeschen Von Sasse ierarsheen 10, 12
Bit Map Modus - siehe HIRES
Blanking des Bildschirms - siehe SCREEN BLANKING
BYE EEE er a re We ae ee A ee ra 11, 25
BARLY ee EEE AI Deere here 30
kassettenpuffer ass aaa er 63, 106 f
Eassettenrecorder sure ri a een 106
Cassettenspeicherung, Aufbau ......c.00. ee een 106
CBM-Programme, Umsetzung von - siehe Adaption
Character Generator - siehe Zeichengenerator
ECHAREN u sen a era r de 43, 125, 129
BHRGETSPOINTET 2 ein ae ran 111
ECHKRIN, Systenrobtine 2. ra se ee 29
EHKDUT, -Systenroutine es ir rs ee des 295
EHRIN;- SySstemröutine: sus. ern . 297
CHRDUTSZ Systenroöutine 2,4: 334u 2 . 297
CHR$ - siehe Steuercodes
EIR, una rue ae 20, 91 ff
EIA,. Interrüpthandling 22,420 04, 8223304 EEE EN 95
ETAS Serieller Port nm sein 92
CIA, Timer „...soeeoeeeeeeee een een nun 92
CIA, Verwendung der CIAs im 64er „oo: eeceeeeeneennneenn ne 98
EIOUT,- Systemroutine un... ea 83, 294
ELALL, Systenröutine u... a Res ee 298
CEDSE,..RS>232. using ee ee 86
CLOSE, Systemroutine ....... en Se ea ee 295
CLRCHN, Systemroutine ....eeeeeeeeeereneeeeeee ernennen ne 295
Collisions - siehe Kollisionen
Color-RAM - siehe Farbspeicher
Colorregister - siehe Farbregister
Color-Nybble-RAM - siehe Farbspeicher
Compare, Maschinenspräache ss. es, 1. a a 29
CPU 2432324 a a a en ee Benin 125
EUTSOT Susan nern El Brarhsireden 60, 299
Data Direction Register - Eiche Datenrichtungsregister
DATA-Zeilen .....cscrc00.. 7, 22, 45, 48, 56, 653, 64, 72, 130
Dateitypen «sr... EEE ERTETUEITESTEREEIRUR 107, 109
Datenrichtungsregister .....ccr0r00: ee DREI 4], 91
Datenwortlaenge ERS=232) 22230 na u ure 86, 87
DECAY u. een ea I 73, 74
DEFFN, Einschraenkungen .....cccr.0.. ee nee 111
DEFFN, Ablage: des Eintrags sus es. sr a ee 17
Devicenumber - siehe Geraetenummer
Dezimalsysten. 2.02. nad 10
DIM sarah Taerar 19
Dimensionierung een Bee ea 18
Directory z.4..4%0.% a Be Eee ea B4
Direktmodus ....scceeseree ee ee ee ee 7
Diskette „544 sungen EEE ee ae 110
Diskette, Anfangsadresse eines Programms ......ee.eceee.. 111
Disketteninhaltsverzeichnis - siehe Directory
BRETEEK.,- Wellenfoörn +... 2 es. a rin 74, 76
Dual... - siehe Binaer...
Echtzeituhr - siehe TIME OF DAY
Ein/Ausgabe siehe CIA und Prozessorport
Einblenden des Zeichengenerators, siehe Zeichengenerator
Eingsbepuffer,: BASICH zn ein nn 7
Einserkömplenent. 532,443 Hr 14
Einzelpunktmodus - siehe HIRES
Einzelzeilenregister „,...uuu ur, a aan 61 - 63
Entwurfsblatt, Sprite- - siehe Sprites
Envelope-Generator - siehe Huellkurve
EOT, EndDOf Tape ar a 109
EXROM 220 rer rare ns 125
Extended Background Color Mode ........2ereeereereree 46, 47
externes Signal (SID, Filter) us sau a ae 77
FAC, Floatingpoint ACcumulator - siehe Fliesskommaakkus
FArbpointer ss ende 46, 47, 52, 57
Farbquelle - siehe Farbpointer
Farb-RAM - siehe Farbspeicher
Farbregister Tasse near 53, 57, 67
Farbspeicher sure 43, 45, 47, 48, 50, 52, 63
Faärbbabelle. 1u422 2325222 sFr einen 67
Kenlerkorrektur 2,2, in seaateen 106
rehlermeldungeny. ID zu... 222 ae 290
Feld - siehe Array
Ferdeinfträg 2250er 19
keldlaengenberechnung: 4... uw su. 2 a 19
Fernsehnorm: PALZNTSE 2023 3 25 een 59, 125, 29]
FI lehändling rss, ee nn 83, 109
Filter ses ae er een 76
Filterkömbination 2432,22. A a a 77
Fläckern,. Vermeidung. ss 0a. 59, 62, 63
FI3Q 22. ann aaa aha essen har 11
Fliesskommazahlen, Darstellung ....oee2ceeeeessereenen ne 15 f
Fliesskommaakkumulatoren ......o.2eeereerereeen ee 165.205» 21
Floppy Disc - siehe Diskette
FORCE: LOAD 30:8 RE EN EEE 93
Frequenzberechnung ...... EEE EEE 73
Funktionen, BASIC- ....22eeeeeeeern nn ar a a Wan arg ee 20
Funktionen, mathematische ......c2cceeeren nern ner ne 20, 21
Funktionen, selbstdefinierte - siehe DEFFN und USR
Funktionen, "StELINgS nor irn 20, 22
Funktionstasten „uss.022.4. ui 23,.71,.72
GARBAGE. EDELFFET ua near ee 18
GAME nu 244 IE yank erg 125
GATE=-BIE 222er 76, 77
gepacktes BCD-Format - siehe BCD-Format
Geraetenummer .„.......:... EEE ENTE EEE 83, 86
GETIN,: SYSEENTOUL ine 444 urn 298
Graphikmodus - siehe HIRES
Halbduplex (RS-232) ....2eeeeeeenn. ee Re Der 87
Header you en een ehetsieeens 106 f
Hexädezimal suisse Renee ande I 3
Hintergrund (Funktion) ..2..ssoooecoceneess sense. 47, 92;:97
Hintergotundfarbe zn. are 4, 48, 50, 53
Hintergrundfarbe, Modus fuer erweiterte - siehe Extended
HILGHPASS ae. 32er ee LO
HERAM Au er era ererusnanlseeenaenest 125, 126
HIRES usa 2553 rare ernserknen 49 - 52
HIRES-Datenablage unter ROM ....orceeereeeeeeeenerenenen 130
Hielikurve vn ar are 74, 77
IEEE=4BB nassen riet 83, 86
IEC-Bus - siehe IEEE-488
Insertmodus ...... ERLEBEN REN WERTET TEUERSTE N 7]
Integer „2:00 ne ne nennen 17, 20
Interne Codierung v von BASIC-Programmen ....ssseeeeeeeee 7, B
Interpretercodes - siehe TOKENS
Interrupt - siehe auch IRQ und NMI ......zcecer0.. 58, 59, 71
Interruptqauellen zus. 2 2 ee 59, 95
Intervalltimer - siehe CIA, Timer
IOBASE, Systemroutine ....... Keen EU 299
I/0O-Bausteine - siehe CIA
TI D=-Bereich zur 2 a Di ea ed 43, 117
IRO: was sera au aernt 43, 59, 98
IRQ-CIA - siehe auch CIA .......cere00. 60, 98, 99, 103 - 105
IRO=Enable; „ira ia an irn OPT 59
IRO=SFLl&gs: ..,2u 302045 HE RE ea 99500
IRQ=Masken 3, 2.3.4. 0 2 rer ern 59
IRQ, Sperren des: vu 422.3u 2 a ie 453, 44, 102
JOYSELCKE- 2 rn een een 101 f
Kassette... - siehe Cassette...
KERNAU=ROM 555: a ri essen 128
KEY-Bit - siehe GATE-Bit
Kollisionen von Sprites - siehe Sprites, Kollisionen
Komplenent sus sure era ener 14
KontroLlparts 2. rn ri rn a aan 101
Lautstserkenkontrolle „zus... 76
Lautstserkeverlauf 3,23 500 28.522 a I 73,. 14
Liahtpen/L3ohtgun u u.a ara een 60, 105
EIDKpöinter owner 8
LISTEN, Systemroutine ......s2cc0ca0n 000 es nennen une 83, 294
Listings, Steuercodes in - siehe Steuercodes
EOAD; .Systemroutine 24 ,.uu ar rer 297
LOAD, BASIC-Befehl .......sccncerececrenen es ee a ee 110
EORAM GE TE A DE I EEE A FEB EL ul 125, 126
LOWPASS ....0.00.. ee AR 76
ManELSSse- sun Des ne 15: f
Maschinensprache .......-.0s0...2..4J.0.00 000% 20, 49, 51, 61, 62
MEMBDT ,--Systemroutine 0.2.20, 27 1. 1. en 293
Mehr farbige Zeichen . 0 0 08 0 0 0 8 0 0 8 8 0 05 oe o ... ."L.eAete ee se 8 0 ee eo oo 47, 48
MEMOry' Map. saurer een een . 118 ff
MEMTLDR,. Systemroutine zransssonnareäaeen enlar aeean 293
MHhemanie zu... PETER TEN 26
MOBs - siehe Sprites
Movable Object Blocks - siehe Sprites
MPU - siehe CPU
Multicolor Mode. s..4as u 47 - 49, 51, 57
NMI-CIA - siehe auch CIA .....oeeeeeuueneennn 41, 89, 98, 99
NMI=VeKEor wur merci De ee a Br 114
NOISE, Wellenform - siehe RAUSCH
NOT - siehe Einserkomplement
Nybble 20500400 ee u ren ae reware. 1)
OPEN, "BASIC-Befehl z2..:,,34 5020 0 ee 109
BPEN:; RSS 232 ee ee ee essen 86
OPEN, "Systemroutine an. ss en 295
ODperationscodes/OP-Codes .....2oeoreneneon erneuern nennen 33
"OR"-Verknuepfung ....cceeeereee Bere ee ee ee 12
0S/Operatung System - siehe Betriebssystem
Dszillstoren .,,.3:.3.2% ern eee SERIEN RR >
DVERLAY une ee ee Re een 111
Pagdles nee ass nennen 103
Paritaet :(R5-232) sauna ders PURE TREE RITT 87
REEK Tuer, RAM unter ROM ur. See 130
PENOUES- GEL CTA u eat .. 100
Pinouts..des.'Prozessors Sys a Rh . 131
P3noues.des: SID „ru nen euere erlete Bl
PINOUtSs’des: VIE=-TI 1. 22:2 32 era daran 68
PEDT,. SYyStemLoufine 4.1 arena 299
P-LOt-Programn «as een 51
Pointer 7. wur een aan EEE SER ll, 34
ROFE ser nee ten et PER RER a. 91
Port Register - siehe Port
Prioritaet - siehe Sprites, Prioritaet
PROZBESSOTPOTL au nern. 129,:7285
Pruefsumme (Tape) ........ NER ea waere 206
Pulsebreite ........ Dear Searehen enter 12
PULSE, Wellenform - siehe RECHTECK
Quote-ModUSs: zu. aa ir ER Eaneeeu 71
Rahmenfarbe 2... 304 ee EEERET ENT 60, 66
Raster-Register u... ns een >59, 62
RAUSCH', Wellenforn: 5:5... 03 er ren 74, 76
RDTIM,. Systemroutine sus... ae ern 298
READST „. Systemröutine sure en 294
Reals - siehe Fliesskomma
RECHTECK; Wellenform a. ren 74, 75
RECOrdErFMOLDrKöäntraol le seiner are 125
REGISTER Asa anna ai a 11
Registeruebersieht ELIA. va 4u0u na ran 95
Registeruebersicht- SID uns a 78
Registeruebersicht VIC-II .....:...00 a ee ee 6)
RelaL1VBFOgFamMme una I 108
RELEASE, 0 Ku 2 ara 73, 74
Repeat, Tastenwiederholung 40.0000. 8500 2 002... 123
RESTOR,. SyStenroukine ererrrrnriin ng 291
RINGMOAULaE 100 ers Er aan 76
RND - siehe Zufallszahlen
RS=232-Handl1Nng 2 as er 86
RS-232=-S5t al usVarlable was a cr u 88
R5= 232; Belegung des. UWSERPORTS a nun es ana ne 90
Rundungsstelle „..3,2.2..3 4 RR ED 16
RUNSTOPY/RESTORE. 22.22.4430 u2205 5], 56, 72, 103, 113, 128
SAEGEZAHN, Wellenform. sus aaa an 74
SAVE, BASIE=Berfehl. Aussen een 109
SAVE, Systemroutine „asien 297
SAWTOOTH, Wellenform - siehe SAEGEZAHN
304
SENKEY,. :Systemroutine- ;2...2..4s92. 302240405275 71, 102, 293
SCREEN, Systemroutine ........ ET NEUER ... 298
screen Blanking’ ..7.- = saure ea 60, 64
Screen Memory - siehe Bildschirmspeicher
Scrolling zur e en snnein Sea 60 - 62
SECOND, Systemroutine ......sceccr00. re ee B3,; 292
Secondary-Address - siehe Sekundaeradresse
Sekundaeradresse „..v.oeereeoreeereneee ernennen nenne. e . 83
serial: Data Register sun. 2.2 2 en 92
serieller Bus .....ooccseueeeenee nee rennen ne 85 ff, 99
serieller Port zw seen ee 92
SETLFS, Systentoutine. u.a. ann 295
SETMSG, Systemroutine ........... ERETEE EL EEOENT 292
SEINAM; Systemroutine „2... +... HR nn 295
SETTIM, Systemroutine 242222 543, ua 298
SETIMO,; :Systenroutine a... 30 Hrn 293
Shiftregister - siehe Serial Data Register
SID 222200%% ET UNE ee RN, ee ae 73 ff
Signalleitungen - siehe Joystick
Smooth Scrolling - siehe Scrolling
Softkey - siehe Funktionstasten
Soft Scrolling - siehe Scrolling
Speicheraufteilungsuebersicht .......cceererereecee EFTE 117
Speichergrenze, Festlegung .....sscce 00. east 45, 51
SPelcherzelle. zu: 334, 2 a a nen 25 - 27, 33
SPTILEIENETALDOT 4, a nr a rar 70
SPriLeS unsere ir - 92 ft,:’60
Sprites;: Abl358 sur ar Da ri een Sa 53, 54
Sprites, Adresse ......:... er ee ee 43, 54
Sprites, Aktivierung ...cc.ceeeereeeeeeere ern nne 54
Sprites, Entwurfsblatt ......ceeeseeerernenee EN .. 69
Sprites,. Farbe „u. u ran en 53
Sprites, langsames Erscheinen ..........- ER 944,99
Sprites, Kollisionen .....vsecceeereeeeenerereeerenenne 47, 58
Sprites, Multicolor/mehrfarbig .....vc.eeeeeeeereeeeenenen 97
Sprites, Positionierung .....scceeeeeeereenee ET . 54, 55
Sprites, Prioritaeten ......scr0200.. PONTE FERNE 47, 54, 57, 58
Sprites, Vergroesserung .....cvcrerre0e een en U = 36
SBEUNGYEKLALreNH verneint 20, 124
Startadresse von BASIC-Programmen ......ceceeereerernen 7.39
statusvarıable „iur aussen a 14, 106, 294 ff
StellenVvert. ss 10, 11
STEUETEDIER . a naar leur ni 23, 24
SIDP, -5ystemroutine: 34... een 298
Stoppbit (R5=-232) Sasse sense 86, 87
Stringfunktion - siehe Funktionen, String-
SUSTAIN ausweisen een aber 73, 74
SYACHLONISET LION. er ee din 76
SYSLEMLaKEFTEQUENZ: 5:5. rn 73, 74
Systemroutinen .......:.. En EIER TER EN 290 ff
Taktfrequenz ....vsceere... EEE 59, 290
TALK, Systenfoutine 1,40: ae ns 83, 294
Tape-Header - siehe Header
Tastaturabfrage - siehe Funktionstasten und SCNKEY
Il TI aueh 113
TIME OF DAY ....... Meise eereisstendeeen 94, 113 f, 128
FILMeOUt east a REAL 293
Timer - siehe CIA, Timer
IKSA; -Systenroutine „u... were ner 83, 292
LOKENS. 22, 2205 3 22 2 ER ER NR eher 7,9
longenerator: 7 zu,3 222 ea erserea en, DT
TRIANGLE, Wellenform - siehe DREIECK
Vebertragungsrate (RS-232) ..oooceeeeereeeernenenn nn. 86, 87
VUebertragungsrate, eigene Spezifizierung (RS-232) ....... 89
UDTIM, Systemroutine. 2.4.2.3... an 298
UNESN; Systemnroöutine- ..7.: 24:3 sur 42er 853, 84, 294
UNterDBrOogTammsprung ar a ae 29
UNTER, Systemroutine „aus wer Hirn 84, 294
UPN 2esuı 23er ee 21
Üserrate. (NS=-232Y ways we aa ren BI
USR=EFUNKEION nase aan ee ee 20, 114
VEZU esse ERSTELLE IT ERFTEE :i'
Variablenablage ..... Dr ae ee nz 17,:-531
Versrablennane zu 33uu 3.0. are 17
vYarıablentabelle asus esse 17
Varzıablentypen ».2u402,8224 2. 2a 17
VARSUE: zauues ser TREE RR RR NER a Eee ee 17
VECTOR, Systemroutine ...... RN EEE Re a ee 292
Vektoren - siehe Sprungvektoren
Video Matrix - siehe Bildschirmspeicher
VoLllduplex’ 243,22: 42 133 ER ee u: 87.
Vordergrund (Funktion) ...seeceerereeee EEE 47, 52, 57
Vordergründfarbe su. nes. are dia 46, 47
Wwellenformen. es rs 73 - 75
Zahlenumwandlung (dezimal und binaer) ......ceeeeeeeeeenne 11
Zeichenausgaberoutine .....cceeeeeceene FEUERT Iren. RZ
zeichendefipit1on sau u. en ehren 43 - 46
Zeichengenerator ......:..:.. PET NE SE ESS 43, 44, 49
Zeichengenerator, Einblenden .....2.sccereeeeeeereeeenennene 43
Zeichengenerator, Kopieren .....2s.ceeereeeeeeenenen ne 43, 44
Zeichendarstellung .z.scs4s32s Le ar 44, 46, 49
Zerlegung von Adressen - siehe Adresszerlegung
ZERE0OP308 nun, rain EEE RET 125
Zufallszahlen: u... 300034008 2. De ren nee 78
Zusammenhaengen von -BASIC-Pregrammen - siehe Anhaengen ...
zveierkomplement z..4.u44s2e Henne 14
306
Wir bieten Ihnen eine ganze Reihe von weiteren Produkten,
die Ihnen den Umgang mit Commodore-Computern erleichtern.
* EXBASIC LEVEL 11
EXBASIC LEVEL II ist ein Einsteckmodul, das den BASIC-
Befehlsvorrat Ihres Computers mehr als verdoppelt auf den
Gebieten Programmierhilfen, Graphik, Farbsteuerung, Ton-
erzeugung, Mathematik, LEVEL II BASIC-Standard, Schnelle
Cassettenaufzeichnung, Floppyunterstützung u.v.a.m. Mit
ausführlichem 120-seitigem Handbuch in deutscher Sprache.
Gratisinformationen sind bei uns erhältlich.
* T.EX.AS. "Terminal Extended Assembler"
'T.EX.AS.' ist ein professionelles Assembler-System mit
Makro-Assembler, Editor, Re-Assembler, Direkt-Assembler,
Disassembler, Monitor. Features u.a.: Label-Vearbeitung,
Makrodefinition mit beliebig vielen Parametern, Full
Screen Editor (formatfreie Eingabe), dezimale und hexa-
dezimale Arbeitsweise, Bildschirmfenster-Betrieb, Defi-
nition von Ablaufsteuerungsfiles, alle Darstellungsmodi:
Assembly Code - Data - Double Data - Text - ASCII - BSC -
Dump, komplexe Trace-Möglichkeiten u.v.a.m. Mit zwei
umfangreichen Handbüchern: Anfängerbuch (setzt keinerlei
Assemblervorkenntnisse voraus), Programmierhandbuch.
* COMMODORE BASIC-KURS FÜR BEGINNER, ISBN 3-88623-015-5
Dieses Buch erklärt ausführlich die BASIC-Programmierung.
Es ist speziell abgestımmt auf alle Commodore-Computer.
Vorkenntnisse werden nicht vorausgesetzt. Ein unent-
behrliches Standardwerk für alle Benutzer von Commodore-
Geräten.
* CBM SPIELE-BUCH I MIT 64ER ZUSATZ, ISBN 3-88623-004-X
Anhand von 18 Spielprogrammen lernen Sie zahlreiche Tips
und Tricks der Programmierung. BASIC-Vorkenntnisse sind
zum Verständnis erforderlich.
* VC-20 SPIELE BUCH I, ISBN 3-88623-014-7
Wie oben, aber für Commodore VC-20.
* 6502 ASSEMBLER-KURS FÜR BEGINNER, ISBN 3-88986-000-1
Von der BASIC- zur Assembler-Programmierung. Vorkennt-
nisse in Assembler werden nicht vorausgesetzt. Das Buch
führt leicht verständlich und dennoch umfassend in die
Assembler-Programmierung der Commodore-Computer ein. Der
Prozessor 6510 - der im Commodore 64 enthalten ist - wird
berücksichtigt. Ein Standardwerk der Assembler-Program-
mierung.
Wir führen über 1200 Titel und sind damit einer der größten
Distributoren für Computer-Fachliteratur weltweit. Gerne
senden wir Ihnen unseren Buch- und/oder Software-Katalog zu.
INTERFACE AGE Verlagsgesellschaft mbH, Vohburgerstraße 1, D-
8000 München 2], Tel. (089) 5 80 67 02.
EXBASIC
LEVEL I ist
SOFTMODULE - BBASIC LEVEL II ist erweiterbar mit SOFTMODULEN. . der neue
Ein SOFTMODUL ist ein Assemblerprogramm, das in den Computer Basic-Standard
eingeladen wird und den Befehlsvorrat von EXBASIC LEVEL Il er- für Commodore
weitert. Das bedeutet für Sie, wenn Sie sich einmal EXBASIC Computer. „Extend-
LEVEL II zugelegt haben, so haben Sie Zugriff zu einer ed Level ll -Basic” stellt
Auswahl an SOFTMODULEN, die Sie nach Belieben hin- für Ihren Computer ein
zufügen können. Mit anderen Worten: Sie allein stark erweitertes Level Il-
bestimmen, wie weit Sie EXBASIC LEVEL II ausbauen Basic - wie es der TRS-80
wollen, ganz nach Ihren Wünschen. Zwei kennt - zur Verfügung. Mit EX-
Standard SOFTMODULE werden zu EXBASIC BASIC LEVEL Il haben Sie über 75
LEVEL II mitgeliefert; sie enthalten die Be- neue, Außerst leistungsfähige Funk-
fehle SORT/CLEAR u. GOTO X/GOSUB X. tionen für Commodore Computer, die
In Kürze werden weitere SOFTMODULE das Programmieren wesentlich erleich-
lieferbar sein. mehrfachgenaue tern und um ein Vielfaches komfortabler
Arithmetik, erweiterte Graphik, gestalten. Die Implementierung von EBASIC
Codieren und Decodieren von LEVEL Il erfolgt in freie Sockel des Computers
Programmen, Matrizenrech- und ist völlig unproblematisch. Mit EXBASIC LEVEL Il
nungen, Search & Replace erreichen Commodore Computer eine Leistungs-
und vieles andere mehr. fähigkeit, die bisher als unerreichbar galt. Zudem wer-
Schaffen Sie sich den Programme für den TRS-80 mit EXBASIC LEVEL II endlich
schon jetzt die Basis auch auf Commodore lauffähig. Damit steht Ihnen ein riesiges
für die Zukunft - Softwareangebot für Ihren Computer zur Verfügung.
mit EXBASIC EXBASIC L II ist bereits weltweit über IO OOOmal verkauft,
LEVEL II. wollen Sie es sich leisten, auf die neue Standardisierung zu verzichten!
EXBASIC LEVEL Il bekommen Sie bei Ihrem örtlichen
Computerfachhändler.
Das Anleitungsbuch
Zu EXBASIC LEVEL Il bekommen Sie eine aus- |
führliche,120 Seiten starke deutsche Anleitung INIERFACE AGE .
mit Einbauanweisung, Befehlserklärungen,
LEVEL II Basic Kurs und vielen Beispielen geliefert.
Im Unterschied zu manch anderer „Anleitung” han- eiyase
delt es sich hierbei nicht um eine schlecht übersetzte D-8000 ee 91,
kurze Befehlsbeschreibung, sondem um ein didaktisch Tel. (0 89) 580 67 O2
aufgebautes und schrittweise an die neuen Möglichkeiten
von EXBASIC LEVEL II heranführendes Buch, geschrieben vom’
Autor der bei COMPUTER LIFE erschienenen Commodore-Buch-
reihe.
Der neue Basicsiandard
für Commodore Computer
x CBM + VC »VolksComputer + Commodore 64
Hi ktionen:
FIND Suchen nach Text, Variablen, mit
Bereichsangabe. » AUTO automatische
Zeilennummemgenerierung. » DEL
Zeilennummembereich löschen. + RE-
NUM Programmzeilen Umnumerierung.
« TRACE (OFF) Einzelschritt- oder lang-
samer Programmablauf mit Einblen-
dung der jeweils abgearbeiteten Zeile
(vollständige Zeile). * ON/OFF Ein-/Aus-
schalten der Repeatfunktion für die Ta-
sten. Außerdem Fehlermodus: Tritt ein
Programmfenhler auf, so wird die Zeile
automafsett(!) gefistet umel der Cursor
an der fehlerhaften Stelle positioniert. +
DUMP listet alle normalen Variablen mit
Inhalten. » MAIRIX listet alle Felgvaria-
blen (Arrays) mit Inhalten. » LETTER (OFF)
Umschaltung Grafik-/Großkleinschreib-
modus. » FAST (OFF) schnelle Bild-
schirmausgab® bei PRINT-wund LIST. »
"" Symbol für „zuletzt Dearbeitate 7ei-
lennummer” (z.B.: \OO GETAS.IFAS —
"THEN.) + MEM ges Speicherplatzbele-
gung aus: MAIN MEMORY, PROGRAM. :
VARIABLES, ARRAYS, STRINGS, REK, FREE.
«HIMEM Speicherplatzabgrenzung für
Meschinenptogramme. » SQ Einsprung
ın Monitor TIM bzw. EXMON. + SPACE
(OFF) formatiertes tisten. - STOP ON/
OFF Die Stoptaste bleibt auch beim
Ablauf von Maschinenprogrammen ak-
tiv. « HELP listet alle EXBASIC LEVEL Il Be-
fehle. + H&LP* listet die Befehle des nor-
malen Basic. BASIC Ausschalten von
EXBASIC LEVEL}. + MERGE Zusammenfü- , en mil Paramatenioeroabe. : DOKE
"m it Par rüberg .®
gen von Basicprfogrammen fau£h in#
einander) von Kassette. «- MERGE- wie
MERGE. aber von Floppy.
Grafikbefehle:
PRINT AT,Druck an speaffizierte Bild#
schirmstelle. - HPLOT horizontales Plot-
ter. « VPLOT vertikales Plofffen. SET
Grafikpunkt setzen. » RESET Grofikpunkt
löschen. » POINT Abfrage. ob Grafik-
punkt gesetzt oder nicht.
Mathemalische Funktionen:
suc s Maximum aus einer Vo-
nablenliste. - MIN gibt das Minimum
einer Varkabieniiste aus. - FRACOO
Nachkommateil einer Zahl. » ROUND(X)
rundet die Zahl X auf eine ganze Zahl.»
ROUNDOX.Y) rundet die Zahl X auf Y
Nochkommastellen. - ODDOXO Abfrage
ob X gerade oder ungerade ist.
RNDOXO erzeugt Zufallszahten ohne
Naoehkommateil zwischen I und X.»
HEX$OO wandelt die Zahl X in den ent-
sprechenden hexadezimalen String.
„m. » DEC(string) wandelt umgekehrt
Hexstring in die Dezimalzonl.
LEVEL li Basic:
ELSE ermöglicht strukturierte IF.THEN..EL-
SE-Anweisungen, THEN kann bei Ein-
deutigkeit entfallen. - RESTORE mit Zei-
lennummernangabe für gezielten DA-
TA-Zugriff. - ON..RESTORE gesteuertes
RESTORE, ähnlich ON..GOTO. + PRINT
USING Ausdruckformatierung für Bild-
schirm oder Drucker (z.B. für Komma un-
ter Komma Druck von Zahlen). » REK Er-
weiterung der Unterprogrammebenen
für rekursives Programmieren. +» DISPOSE
NEXT Stackrückstellung für FOR-NEXT-
Schleifen (.Notausgang” aus einer
Schleife ohne NEXT). - DISPOSE RETURN
Wechsel auf eine höhere Unterpro-
grammebene ohne RETURN-Sprung. »
DISPOSE CLR®Aussprung aus allen
Schleifen und Unterprogrammen,
unabhängig von Schachtelung und
Tiefe. «JMRUTLINE ermöglicht die Einga-
be aller Zeichen, also auch Komma,
Anführungszeichen, Steuerungszei-
chen, Doppelpunkt ohne Einschränkun-
gen. bei leerer Eingabe wird Yas Pro-
gramm nicht abgebrochen, sondem
die Eingabevariable behält ihren vor-
herigen Inhalt. - INPUTFORM Eingabe
von Standardzeichen (keine Cursor-
steuerung oder RVS, aber Komma, An-
führungszeichen etc.), sonst wie INPUT-
LINE. aber es kann eine bestimmte Ein-
gabelänge spezifiziert werden und an-
deres. DEF USR= definiert USR-Vektor. »
DEF CALL= definiert CALL-Vektor. »
CALL Aufruf vopMaschinenprogram- .
Doppelbyte-POKE bis 65535. - DEEK :
Donpelbyte-PEEK. » VARPTR gibt die
RAM-Adresse an, wo eine bestimmte
Variable abgespeichert ist. - SPACE
Druck auf definiertes Bildschirmfetel. -
STRING$ Beispiel: AS=STRING$ (5.- ”) ist
gleichbedeutend mit A$="-----". « INSTR
untersucht ob ein String in einem ande-
ren enthalten ist. «- EVAL ähnlich VAL,
aber Bsp.: VAL ("12-49 ist 12, während
EVAL ("12-4°) den Wert 48 ergibt. EVAL
verarbeitet alle Funktionen. » EXEC führt
Basic-Befehle im String aus. « SWAP ver-
tauscht zwei Variablen ofine Zuhilfe-
nahme einer dritten. - SEC Programm-
pause für X Sekunden. » BEEP Tonerzeu-
gung an C$2. Tohnhöhe und -dauer
können mit angegeben werden. » ON
ERROR GOJO ermöglicht die selbstän-
dige Fortsetzung eines Programmes
nach Auftreten eines Programmfenlers.
Zur Fehlerbehandlung stehen die Varia-
bien EC (error code) und EL (error line)
zur Verfügung. + RESUME Abschluß einer
Fehlerbehandlungsroutine, die mit ON
ERROR GOTO angesprungen wird, mit
verschiedenen Möglichkeiten. RESUME;
RESUME NEXT, RESUME Zeilennummier. «
“«“ Ersatzsymbol für den Befehl REM. »
HARDCOPY kopiert den Bildschirm auf
einen Drucker. y :
FAST TAPE (CBM 2/3/4: VC 20/64)
Hur dıe genamnten Serien stehen ne-
ben den normalen Kassettenrekorder-
befehlen neue zur Verfügung, die mit
Sfacher Geschwindigkeit arbeiten. Pro-
grammnamen dürfen bis zu 30 Zei-
chen (normal 16) lang sein. MOD er-
zeugt ein Proggamm, das von jedem
anderen Computer auch ohne EXBA-
5IC LEVEL Il fünfmal so schnell eingela-
Jem werden kann und egal wie es ein-
gelesen wird, automatisch startet.
DOS SUPPORT (CBM 2/3/4. VC 20/64)
Das DOS SUPPORT bietet komfortable
Unterstützung beim Arbeiten mit einer
Floppystation durch die Verwendung
von Kurzbefehlen. Mit EXEC sind alle
POS SUPPORT Funktionen auch pro-
grammierbar.
Bildschirnfisond&iuefehie. SCREEN defi-
niert Bildschirmfenster. + DELLINE löscht
eine oder mehrere Bildschirmzeilen. +
INSTLINE schafft Platz für eine oder
mehrere Bildschirmzeilen. + ENDLINE
löscht ab Cursorposition bis Zeilenende.
BEGINLINE Iöscht vom Zeilenanfang
bis zur Cursorposition. + SCREEN UP/
DOWN Bildschirmrollen nach oben und
ten » SCREEN » macht den 80-
ichen-Bildschirm des CBM 8000
kompatibel zum 40-Zeichen-Schirm
der anderen Serien
EXMON (CBM 8):
Für die Serie 8000 enthält EXBASIC LE-
VEL Il einen Maschinensprachemonitor,
der mit GO aufgerufen wıra una foı-
gende Befehle bietet: A = Assemblie-
“ ren «+ C = Berechnung eines relativen
Offsets «+ D — Disassemblieren auf dem
Bildschirm + G = Ausführung ’eines As-
semblerprogrammes » L = Laden eines
Programmes (Kassette oder Diskette) -
M = Hexdump +» P = Disassemnblieren
duf &inem Drucker »- S = Abspeichern
eines Assembierprogrammes
COLOR SUPPORT (VC 20/64) _
mit speziellen Kommanaos zur Farb-
gestaltung.
SOUND SUPPORT (VC 20/64
onderbefehle tür die Ion- und Sound-
programmierung
KEY DEFINER (VC 20/64
ergo endefinitionen
Der Preis? Er ist - gemessen an den vielfältigen Möglichkeiten, die
EXBASIC LEVEL Il bietet - so klein, daß wir ihn hier fast vergessen
hätten: DM 392.- inkl. MwSt. (unverbindliche Verkaufsempfehlung).